【问题标题】:Split string based on regex but keep delimiters基于正则表达式拆分字符串但保留分隔符
【发布时间】:2012-11-14 05:42:15
【问题描述】:

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

如果 (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 中实现吗? 谢谢

【问题讨论】:

标签: java regex split delimiter


【解决方案1】:

好吧,您可以使用环视在 个字符之间分割点,而无需使用分隔符:

(?<=[()>*-;\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|)|;|

【讨论】:

    【解决方案2】:

    这个模式怎么样?

    (\w+)|([\p{P}\p{S}])
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 2014-11-22
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 2012-06-29
        • 2013-09-27
        相关资源
        最近更新 更多