java - 如何使 Java String 贪婪地拆分为 lookahead?

标签 java regex split

代码基本上是:

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/

相关文章:

java - 如何使用pdfbox获取PDF表单文本域的内容?

java - 如何为 log4j2 RollingFileAppender 进行编程配置

java - 使用 Intent 传递对象后,如何在 Android 中反序列化我的对象?

c# - 正则表达式字符串定义问题

正则表达式排除 101 和 110

Java - 将数据分割成二维数组

java - 静态与新对象

c# - 在 C# 正则表达式中使用条件替换进行 CSS 缩小

javascript - 转义/在.split()

python - 在第二次出现字符后拆分文本