减号破坏方程式提取

时间:2014-07-31 19:30:28

标签: regex pcre

我正在尝试制作一个正则表达式,从等式中提取数值常数和运算符。

例如,如果输入X_1 + 1234 * 5678 + 2(其中X_1不是常量,那么它被忽略),我想提取1234 * 5678 + 2

我有一个适用于上述情况的正则表达式,但是当第一个数字为负时它会中断。

这是我当前的正则表达式(为了清晰起见添加了空格):

\b( (?:-?\d+) (?:\s*[\*\+]\s* (?:-?\d+))+ )\b

但是,如果第一个数值常量为负数,则跳过减号 例如,输入X_2 * -128 + 18 * 3时,表达式会提取128 + 18 * 3,从-中删除128

我认为问题是主要的单词边界锚点,但如果没有它,则会包含来自2的{​​{1}},这是不正确的。我该怎么做才能正确包含负数但不会意外包含变量?


编辑:为简单起见,“变量”是任何不是数字常量的东西。 “数值常数”是正整数值或负整数值。在上面的表达式中,它们与X_2匹配。

3 个答案:

答案 0 :(得分:2)

是的,单词边界确实会产生问题,因为它在单词之前或之后匹配,连字符不被视为单词字符,因此\b-永远不会匹配。

您可以使用替换匹配正则表达式中的-\b

( (?:(?:-|\b)\d+) (?:\s*[*+]\s* (?:-?\d+))+ )\b

RegEx Demo

答案 1 :(得分:1)

跳过减号,因为-和下一个数字之间的点本身就是一个单词边界。使用\b 可能不是必需的。我希望每个操作数用空格分隔:

\s((?:-?\d+)(?:\s*[\*\+]\s*(?:-?\d+))+)\s

答案 2 :(得分:0)

如果变量总是一个字母并且在左边,那么尝试使用这个更易读的正则表达式:

-?\d+(?=\d+).*

Test it here