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

use*_*199 1 java regex split delimiter

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

if(x> 1)返回x*fact(x-1);

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

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

它会在每个单词字符处分开,而不管它是否跟在其中一个分隔符之后.例如

测试+ 1

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

为什么它会在每个角色上分裂,即使该角色没有被我的一个分隔符跟着?也是一个正则表达式,甚至可以在Java中实现这一点?谢谢

Joe*_*oey 5

好吧,您可以使用环视分割字符之间的点而不使用分隔符:

(?<=[()>*-;\s])|(?=[()>*-;\s])
Run Code Online (Sandbox Code Playgroud)

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

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

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