【发布时间】:2015-05-07 18:04:53
【问题描述】:
我需要匹配如下字符串:
( anything >= anything )
只有这些比较运算符可以存在: >= 它们只能存在一次。 我所拥有的是:
^\(.+(>=|<=|>|<|==|!=).+\)$
但它匹配诸如 >=!= 之类的内容。 我确实查看了stackoverflow问题并搜索了但找不到正确的解决方案。
你能帮我解决这个问题吗?
【问题讨论】:
我需要匹配如下字符串:
( anything >= anything )
只有这些比较运算符可以存在: >= 它们只能存在一次。 我所拥有的是:
^\(.+(>=|<=|>|<|==|!=).+\)$
但它匹配诸如 >=!= 之类的内容。 我确实查看了stackoverflow问题并搜索了但找不到正确的解决方案。
你能帮我解决这个问题吗?
【问题讨论】:
如果您还打算捕获(myName == "Денис") 之类的字符串,则需要使用以下正则表达式:
^\((?>(?![<>=]=|!=|[<>]).)*?(?:[<>=]=|!=|[<>])(?>(?![<>=]=|!=|[<>]).)*?\)$
请参阅demo on Regexstorm(支持 .NET 正则表达式风格,与 regex101.com 不同)
由于使用了atomic grouping ((?> ... ))、character classes ([<>=]) 和惰性匹配 (@987654329),根据 http://regexhero.net 的测试结果,它比 Karthik Manchala 的建议快得多@)。此外,如果== 运算符之前或之后缺少空格,我的正则表达式仍将捕获表达式。
使用(?m)^\((?>(?![<>=]=|!=|[<>]).)*?(?:[<>=]=|!=|[<>])(?>(?![<>=]=|!=|[<>]).)*?\)$,我的正则表达式每秒产生 15,783 次迭代,而 Karthik 的
(?m)^\(((?!(>=|<=|>|<|==|!=)).)+\s+(>=|<=|>|<|==|!=)\s+((?!(>=|<=|>|<|==|!=)).)+\)$ 产生每秒 9,204 次迭代的速度。
【讨论】:
像^\(\s*[a-zA-Z0-9_+\-\/* ]+\s*(>=|<=|>|<|==|!=)\s*[a-zA-Z0-9_+\-\/* ]+\s*\)$ 这样的正则表达式应该可以解决问题,对吧?
【讨论】:
[A-z] 还捕获 "[ \ ] ^ _ 和 `(在你的正则表达式中删除 _,你仍然会捕获这个符号),+-\/ 创建一个范围,它也捕获,、- 和 .。符号 / 在 C# 正则表达式中不需要转义。最后,regex101.com 不是测试 .NET 正则表达式的正确服务,因为它不支持它们(虽然PCRE引擎在更大程度上确实相似)。
您可以使用以下内容:
^\(((?!(>=|<=|>|<|==|!=)).)+\s+(>=|<=|>|<|==|!=)\s+((?!(>=|<=|>|<|==|!=)).)+\)$
解释:
((?!(>=|<=|>|<|==|!=)).)+ 除(>=|<=|>|<|==|!=) 以外的任何字符
\s+(>=|<=|>|<|==|!=)\s+ 后跟的运算符之一((?!(>=|<=|>|<|==|!=)).)+ 除(>=|<=|>|<|==|!=) 以外的任何字符
【讨论】: