用于比较表达式的正则表达式

Regex for comparison expression

我需要匹配如下字符串:

( anything >= anything )

并且只有这些比较运算符才能存在:>= <= == != < > 而且它们只能存在一次。 我有的是:

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

但它匹配诸如 >=!= 之类的东西。 我确实浏览了 Whosebug 问题并进行了谷歌搜索,但找不到正确的解决方案。

你能帮我解决一下吗?

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

A Regex101 with it in action can be found here.

您可以使用以下内容:

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

解释:

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

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

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

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

根据 http://regexhero.net, due to the use of atomic grouping ((?> ... )), character classes ([<>=]) 和惰性匹配 (*?) 的测试结果,它比 Karthik Manchala 的建议要快得多。此外,如果 space 在 == 运算符之前或之后丢失,我的正则表达式仍将捕获表达式。

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