java - 基于正则表达式拆分字符串但保留分隔符

标签 java regex split delimiter

我正在尝试使用各种字符作为分隔符来拆分字符串,并将这些分隔符保留在它们自己的数组索引中。例如说我想拆分字符串:

if (x>1) return x * fact(x-1);

使用'(', '>', ')', '*', '-', ';'和 '\s' 作为分隔符。我希望输出为以下字符串数组:{"if", "(", "x", ">", "1", ")", "return", "x", "*", "fact ", "(", "x", "-", "1", ")", ";"

目前我使用的正则表达式是 split("(?=(\\w+(?=[\\s\\+\\-\\*/<(<=)>(>=)(==)(!=)=;,\\.\"\\(\\)\\[\\]\\{\\}])))")

在每个单词字符处拆分,而不管它后面是否跟有一个定界符。例如

test + 1

输出 {"t","e","s","t+","1"} 而不是 {"test+", "1"}

为什么它会在每个字符处拆分,即使该字符后面没有我的分隔符之一?还有一个正则表达式,它甚至可以在 Java 中实现吗? 谢谢

最佳答案

好吧,您可以使用环视在 个字符之间的点处进行拆分,而无需使用分隔符:

(?<=[()>*-;\s])|(?=[()>*-;\s])

这将在每个分隔符前后创建一个分割点。不过,您可能需要从结果数组中删除多余的空白元素。

快速 PowerShell 测试(| 标记分割点):

PS Home:\> 'if (x>1) return x * fact(x-1);' -split '(?<=[()>*-;\s])|(?=[()>*-;\s])' -join '|'
if| |(|x|>|1|)| |return| |x| |*| |fact|(|x|-|1|)|;|

关于java - 基于正则表达式拆分字符串但保留分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373608/

相关文章:

java - 正则表达式:从字符串中的引号之间获取值

java - 在 Android 应用程序中使用 youtube API 滚动屏幕时如何避免视频停止?

java - 带分隔符的多个匹配项

java - 在 Java 中分割字符串,但将分隔符保留在每个新字符串中

linux - 使用linux基于csv将文件拆分为可变数量和目录

java - 如何在 Fitnesse 中引用外部类

java - 如何使用 Java 正则表达式将带有撇号的单词算作两个单独的单词

c# - C#中奇怪的Regex行为

java - 如何使用索引值拆分正则表达式

java - 如何监听多个 Gmail 帐户上传入的电子邮件 - Java