我正在尝试制作一个正则表达式,从等式中提取数值常数和运算符。
例如,如果输入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
匹配。
答案 0 :(得分:2)
是的,单词边界确实会产生问题,因为它在单词之前或之后匹配,连字符不被视为单词字符,因此\b-
永远不会匹配。
您可以使用替换匹配正则表达式中的-
或\b
:
( (?:(?:-|\b)\d+) (?:\s*[*+]\s* (?:-?\d+))+ )\b
答案 1 :(得分:1)
跳过减号,因为-
和下一个数字之间的点本身就是一个单词边界。使用\b
可能不是必需的。我希望每个操作数用空格分隔:
\s((?:-?\d+)(?:\s*[\*\+]\s*(?:-?\d+))+)\s
答案 2 :(得分:0)