代码基本上是:
String[] result = "T&&T&T".split("(?=\\w|&+)");
我原以为前瞻是贪婪的,但它返回的是数组:
T, &, &, T, &, T
我的目标是:
T, &&, T, &, T
拆分和前瞻是否可行?
我已经尝试了以下拆分正则表达式值,但结果仍然不适合 & 符号:
"(?=\\w|&&?)"
"(?=\\w|&{1,2})"
最佳答案
它已经很贪心了,但我认为你误解了你的拆分是如何工作的。问题是您考虑的是字符而不是字符之间的空格(这是正则表达式可以摆脱您的地方之一)。
您要求在字符串中下一个字符是单词字符或一系列 & 符号的位置进行拆分。在您的字符串中,让我们标记满足该条件的地方:
T|&|&|T|&|T
在第一个 T 和第一个 & 符号之间的空格中,下一个字符是 & 符号(匹配 (?=&)
这在您的正则表达式中有效),两个 & 符号之间的空格也出于同样的原因匹配。 & 符号和第二个 T 之间的空格也匹配(匹配 (?=\w)
),依此类推。
拆分函数将测试字符串中的每个空格,以确定它是否是拆分位置的候选者。为了做你想做的事,你必须小心使用前瞻,这样我们就不允许在一串 & 符号的中间进行拆分。
有多种方法可以克服这个问题; Wiktor Stribiżew 在他的评论中提供了一个可行的建议。
通常使用后视来检查您是否没有重复不需要的字符会起作用,或者如果可能的话,您可以使用后视来识别匹配的位置,并使用前视来避免不需要的重复。例如,如果我们希望拆分所有字符并将重复的字符保持在一起,您可以这样做 (?<=(.))(?!\\1)
将您的示例拆分为 T, &&, T, &, T
.
关于java - 如何使 Java String 贪婪地拆分为 lookahead?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35914648/