【发布时间】:2014-03-20 11:47:26
【问题描述】:
问题描述
我正在尝试使用 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}/),");
但这仍然对输入施加了限制。所以我决定把复现从look-behind组中去掉,然后想出了这个:
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 中)?
【问题讨论】: