【问题标题】:Minus sign breaking equation extraction减号破坏方程提取
【发布时间】:2014-09-23 21:36:03
【问题描述】:

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

例如,给定输入 X_1 + 1234 * 5678 + 2(其中 X_1 不是常量,因此被忽略),我想提取 1234 * 5678 + 2

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

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

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

但是,如果 first 数字常量为负数,则将跳过减号。
例如,输入为X_2 * -128 + 18 * 3,表达式提取128 + 18 * 3,从128 中删除-

我认为问题在于引导词边界锚点,但如果没有它,则包含来自 X_22,这是不正确的。如何正确包含负数但不会意外包含变量?


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

【问题讨论】:

  • 这是我当前表达的一个例子:regex101.com/r/bP4zG0/2
  • 您能再发表一些意见吗?尤其是在 X_1 使用不同名称的地方。我们需要查看变量的不同模式
  • 你试过正则表达式调试器吗? debuggex.com

标签: regex pcre


【解决方案1】:

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

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

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

RegEx Demo

【讨论】:

  • 啊!我之前尝试过这样的事情,但忘记删除前导\b。看起来这样就行了!
【解决方案2】:

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

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

【讨论】:

  • 在操作数 不是 用空格分隔的情况下,有什么可以工作的吗?为了便于阅读,我在上面给出的示例中添加了空格,但我正在使用的输入可能无法预测。
【解决方案3】:

如果变量中总是一个字母并且总是在左边,请尝试使用这个更具可读性的正则表达式:

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

Test it here

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多