问题描述
我正在尝试使用String类提供的split()方法将a字符串拆分为单独的字符串。文档告诉我它会在匹配参数(即正则表达式)周围进行拆分。我使用的分隔符是逗号,但逗号也可以被转义。我使用的转义字符是斜杠 /(只是为了让事情变得更简单,不使用反斜杠,因为这需要在Java和正则表达式中的字符串字面量中进行额外的转义)。
例如,输入可能是这样的:
a,b/,b//,c///,//,d///,
输出结果应该是:
a
b,b/
c/,/
d/,
所以,应该在每个逗号处拆分字符串,除非该逗号前面有奇数个斜杠(1、3、5、7、...,∞),因为这意味着逗号被转义了。
可能的解决方案:
我的初步猜测是这样拆分的:
String[] strings = longString.split("(?<![^/](//)*/),");
但这是不允许的,因为Java不允许无限回溯组。我可以通过将*替换为{0,2000}来限制重复次数,例如:
String[] strings = longString.split("(?<![^/](//){0,2000}/),");
但是这仍然对输入有限制。因此,我决定将循环从反向引用组中去除,并得出了以下代码:
String[] strings = longString.split("(?<!/)(?:(//)*),");
然而,它的输出是以下字符串列表:
a
b,b (the final slash is lacking in the output)
c/, (the final slash is lacking in the output)
d/,
为什么第二个和第三个字符串中省略了斜杠,我该如何解决它(在Java中)?
(?<![^/](?://){0,99}/)
。像这个解决方案一样,干净简单,尽管在 99 限制的情况下理论上并不涵盖所有情况。 - YoYo