问题描述
我试图使用 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} 将重复次数限制为 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中)?