正则表达式分隔二元运算符

时间:2017-02-06 18:58:56

标签: regex token

我需要将标记分开:= == <= >= < >~=整齐地放在单独的正则表达式中。目前我有:

(=)    for = 
[=]{2} for == 
(<=)   for <=
(<)    for <
(>=)   for >=
(>)    for >
\~=    for ~=

但我担心这些会相互干扰(=无法匹配等号(例如<=

有什么建议吗? 我是regex的新手,所以如果你有答案,请解释一下: - )

1 个答案:

答案 0 :(得分:1)

这有点取决于您的环境和正则表达式引擎!如果它是DFA或POSIX NFA引擎,那么您总是会匹配最长最左侧可能的模式。您可以通过尝试匹配

来确定您的引擎是否以这种方式工作
nfa|nfa not 

反对字符串&#34; nfa not&#34;。如果整个字符串匹配,那么你知道你正在使用最长的最左边的引擎,即。 DFA或POSIX NFA。

然而,最常见的引擎类型是传统NFA,你可以通过你的正则表达给你很多表现力和控制力,但是,像往常一样,这种力量来自责任。在传统的NFA中,最长的最左边是无法保证的。我将解释Alex K的abc | ab |解决方案。 &#39; |&#39; (称为OR或交替)是一种表示匹配abc或ab的方式。你可能想知道,&#34;如果文字是&#39; abc&#39;在这种情况下,任何一个都可以工作!&#34;。那是真实的!在传统的NFA中,选项从左到右进行尝试。所以在传统的NFA中,在文本中搜索ab | abc&#34; abc&#34;将匹配&#34; ab&#34;并且搜索abc | ab将匹配整个&#34; abc&#34;。您可以通过在文字中搜索&lt; = | =来充分利用这一点,以确保您始终获得&#39;&lt; =&#39;而不只是&#39; =&#39;。

事实证明,Alex K的解决方案无论引擎如何都能正常工作,因为&#39;&lt; =&#39;也是最长的,最左边的比赛。我想我会给出更深入的解释,以提供一些理解,也许会引起你的兴趣。查看&#39;掌握正则表达式&#39;作者:J。Friedl如果你想了解更多!