【问题标题】:Regex for comparison expression比较表达式的正则表达式
【发布时间】:2015-05-07 18:04:53
【问题描述】:

我需要匹配如下字符串:

( anything >= anything )

只有这些比较运算符可以存在: >= 它们只能存在一次。 我所拥有的是:

^\(.+(>=|<=|>|<|==|!=).+\)$

但它匹配诸如 >=!= 之类的内容。 我确实查看了stackoverflow问题并搜索了但找不到正确的解决方案。

你能帮我解决这个问题吗?

【问题讨论】:

    标签: c# regex match


    【解决方案1】:

    如果您还打算捕获(myName == "Денис") 之类的字符串,则需要使用以下正则表达式:

    ^\((?>(?![<>=]=|!=|[<>]).)*?(?:[<>=]=|!=|[<>])(?>(?![<>=]=|!=|[<>]).)*?\)$
    

    请参阅demo on Regexstorm(支持 .NET 正则表达式风格,与 regex101.com 不同)

    由于使用了atomic grouping ((?&gt; ... ))、character classes ([&lt;&gt;=]) 和惰性匹配 (@987654329),根据 http://regexhero.net 的测试结果,它比 Karthik Manchala 的建议快得多@)。此外,如果== 运算符之前或之后缺少空格,我的正则表达式仍将捕获表达式。

    使用(?m)^\((?&gt;(?![&lt;&gt;=]=|!=|[&lt;&gt;]).)*?(?:[&lt;&gt;=]=|!=|[&lt;&gt;])(?&gt;(?![&lt;&gt;=]=|!=|[&lt;&gt;]).)*?\)$,我的正则表达式每秒产生 15,783 次迭代,而 Karthik 的 (?m)^\(((?!(&gt;=|&lt;=|&gt;|&lt;|==|!=)).)+\s+(&gt;=|&lt;=|&gt;|&lt;|==|!=)\s+((?!(&gt;=|&lt;=|&gt;|&lt;|==|!=)).)+\)$ 产生每秒 9,204 次迭代的速度。

    【讨论】:

      【解决方案2】:

      ^\(\s*[a-zA-Z0-9_+\-\/* ]+\s*(&gt;=|&lt;=|&gt;|&lt;|==|!=)\s*[a-zA-Z0-9_+\-\/* ]+\s*\)$ 这样的正则表达式应该可以解决问题,对吧?

      A Regex101 with it in action can be found here.

      【讨论】:

      • 恐怕,不......“任何东西”我的意思是它也可能像下面这样:( a + b >= a - g[i, j+d] )
      • 这是一个非常快的正则表达式,但是,它只能匹配算术比较。此外,这有点误导:[A-z] 还捕获 "[ \ ] ^ _ 和 `(在你的正则表达式中删除 _,你仍然会捕获这个符号),+-\/ 创建一个范围,它也捕获,-.。符号 / 在 C# 正则表达式中不需要转义。最后,regex101.com 不是测试 .NET 正则表达式的正确服务,因为它不支持它们(虽然PCRE引擎在更大程度上确实相似)。
      • 这都是真的;我真的不习惯 C# 的正则表达式风格,尤其是因为 JavaScript 的版本没有那么多功能。我已尝试将正则表达式更改为更准确 - 感谢您的提醒!
      【解决方案3】:

      您可以使用以下内容:

      ^\(((?!(>=|<=|>|<|==|!=)).)+\s+(>=|<=|>|<|==|!=)\s+((?!(>=|<=|>|<|==|!=)).)+\)$
      

      解释:

      • ((?!(&gt;=|&lt;=|&gt;|&lt;|==|!=)).)+(&gt;=|&lt;=|&gt;|&lt;|==|!=) 以外的任何字符
      • \s+(&gt;=|&lt;=|&gt;|&lt;|==|!=)\s+ 后跟的运算符之一
      • ((?!(&gt;=|&lt;=|&gt;|&lt;|==|!=)).)+(&gt;=|&lt;=|&gt;|&lt;|==|!=) 以外的任何字符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2017-10-08
        • 2016-04-28
        • 1970-01-01
        相关资源
        最近更新 更多