我正在尝试使用各种字符作为分隔符来分割字符串,并将这些分隔符保留在它们自己的数组索引中。例如,说我要拆分字符串:
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中实现这一点? 谢谢
答案 0 :(得分:5)
好吧,您可以使用环视功能在字符之间的点进行拆分而不使用分隔符:
(?<=[()>*-;\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|)|;|
答案 1 :(得分:0)
这种模式怎么样?
(\w+)|([\p{P}\p{S}])
答案 2 :(得分:0)
回答你的问题,“为什么?”,这是因为你的整个表达是一个先行断言。只要该断言对每个字符都是正确的(或者我应该说“介于”之间),它就能分裂。
此外,你不能在字符类中进行分组,例如。 (<=)
没有做你认为它正在做的事情。