1

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

如果 (x>1) 返回 x * 事实(x-1);

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

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

它会在每个单词字符处拆分,无论它后面是否有一个分隔符。例如

测试 + 1

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

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

4

3 回答 3

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|)|;|
于 2012-11-14T05:50:57.787 回答
0

这个图案怎么样?

(\w+)|([\p{P}\p{S}])
于 2012-11-14T05:49:29.357 回答
0

要回答您的问题“为什么?”,这是因为您的整个表达式是一个前瞻断言。只要该断言在每个字符上都是正确的(或者我应该说“介于”),它就可以分裂。

此外,您不能在字符类中进行分组,例如 (<=)没有做您认为它正在做的事情。

于 2012-11-14T05:52:50.177 回答