【问题标题】:Regular expression to match digits and basic math operators匹配数字和基本数学运算符的正则表达式
【发布时间】:2009-10-27 15:58:15
【问题描述】:

我需要一个匹配的正则表达式 0-9,(,),+,-,*/

【问题讨论】:

  • 使用怀孕?埃雷格?什么语言?什么系统?

标签: regex


【解决方案1】:

接受的答案不能处理很多基本情况。 这应该可以完成工作:

^([-+]? ?(\d+|\(\g<1>\))( ?[-+*\/] ?\g<1>)?)$

说明:

我们要匹配整个字符串:

^...$

表达式可以有符号:

[-+]? ?

一个表达式由多个数字或另一个有效的表达式组成,用括号括起来:

(\d+|\(\g<1>\))

一个有效的表达式后面可以跟一个操作和另一个有效的表达式,并且仍然是一个有效的表达式:

( ?[-+*\/] ?\g<1>)?

【讨论】:

  • 如何在javascript中使用\g?我知道这仅适用于 PCRE 正则表达式? regex101.com/r/HdBU3E/2
  • @hizmarck 确实如此,这仅适用于 PCRE 正则表达式引擎。
  • @ndnenkov "\g" 是什么意思?我没有找到相关的语法?你能解释一下吗?
  • @hizmarck 嗨,你解决了吗?我也想在 JavaScript 中使用它
  • @ink 用非递归正则表达式匹配无限平衡括号是不可能的。您可以根据您的具体情况做出一些妥协。例如,如果您不允许 (/) 这是完全可以解决的。或者你可以有固定数量的嵌套(比如一个人不能将括号嵌套在括号内超过 3 次)。或者,您可以允许无限嵌套并使用正则表达式来确保您有相同数量的左括号和右括号,然后添加一些代码来检查正则表达式是否匹配时的正确平衡。
【解决方案2】:

您可能正在尝试匹配 5+7-3 之类的数字表达式。

这应该匹配他们:

([-+]?[0-9]*\.?[0-9]+[\/\+\-\*])+([-+]?[0-9]*\.?[0-9]+)

【讨论】:

  • 这个答案不包含问题中提到的括号。如果你有一个操作 (2+3)*(5/(7-1)) 怎么办?
  • 此外,错误地表示25*(53+5 有效,而2*(3) 无效。如果您想尝试查找更多信息:jsfiddle.net/a7eg9a78
【解决方案3】:
[\d\(\)\+\-\*\/\.]

【讨论】:

  • 我认为您不需要在字符类中转义 (,),-,+ 等。这取决于语言不是吗?
  • @Jass,至少在 Perl 中你是对的。但是您确实需要注意,您要么转义 /,要么编写像 m~[\d()+*/.-]~ 这样的正则表达式。
  • 转义语法取决于您使用的语言。
  • 是的,我们在那里转义 / 因为语言需要它以便它可以识别 / 并将其传递给正则表达式引擎而不是吃掉它。就像你说的 m~~ 的使用是一种解决方法.. :)
【解决方案4】:

我认为您正在寻找字符类

[0-9()+\-*/.]

这应该匹配包含从 0 到 9 或 ( ,)、+、- 或 * 的任意数字的单词

【讨论】:

  • +-* 是无效范围,将“-”放在末尾,它应该可以工作
  • 我认为-应该是第一个字符,比如[-0-9()+*/],不是吗?
  • 是的,我认为解决方案是字符类,但作为对 inshallah 的回应,不应该只转义“-”就足够了吗?我的理解是,根据系统(OP未指定atm),诸如that之类的字符可能具有特殊含义,实际上*和括号也可以。我认为 OP 最好阅读他的特定正则表达式系统的任何文档。
  • @Victor,把-放在第一个也可以:-),从来不知道。
【解决方案5】:

如果你需要一个正则表达式来匹配这样的算术表达式:3+2-24*2/2-1,你可以试试这个:

String reg1="([0-9]+[\\+\\-\\*\\/]{1}[0-9]+)+([\\+\\-\\*\\/]{1}[0-9]+)*";

如果您要编辑此正则表达式,您可以将括号添加到您想要的位置。

【讨论】:

  • 我将您的答案标记为有用,因为它对我的工作有所帮助。以上所有答案对我没有多大帮助。谢谢。
【解决方案6】:
regex  = '(?:[0-9 ()]+[*+/-])+[0-9 ()]+'
string = 'mig 2*7 5+ 43 asf 4 3+32 *33 as 0 fa 3 5+9 m (3 + 5) - 9*(99)'
re.findall(regex, string)
# answer
# [' 2*7 5+ 43 ', ' 4 3+32 *33 ', ' 3 5+9 ', ' (3 + 5) - 9*(99)'] 

【讨论】:

  • 虽然这段代码可能会解决问题,但一个好的答案还应该解释它的作用以及它的帮助。
【解决方案7】:
[0-9\(\)\+\-\*\./\"]

【讨论】:

    【解决方案8】:

    这个正则表达式对我有帮助,只是在这里记下它可能对其他人有帮助。

    ^[0-9+\-*\/\(\)]*$
    

    【讨论】:

      【解决方案9】:

      这适用于小数点后 4 位的数学表达式:

      ^([-+]? ?(\d+(\.\d{0,4})?|\(\g<1>\))( ?[-+*\/] ?\g<1>)?)$
      

      它的灵感来自@ndnenkov 的回答。

      我希望这对某人有用。

      【讨论】:

        【解决方案10】:
        ^[0-9()+\-*.\/]*$

        https://regex101.com/r/377yXA/1

        这个正则表达式对我有用

        【讨论】:

          猜你喜欢
          • 2017-09-26
          • 1970-01-01
          • 2015-07-31
          • 1970-01-01
          • 2014-05-06
          • 2021-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多