正则表达式忽略了第一个“小于”字符

时间:2018-01-12 19:49:34

标签: javascript regex

测试字符串:

From: John Smith <johnsmith@gmail.com> Date: Fri, 12 Jan 2018 13:56:47 -0500 Message-ID: <CAOiWwegyRC+FE75Ezw3AxiCbNegswuQz8eLCCO0=hFGsLA@mail.gmail.com> Subject: test email To: bobsmith@yahoo.com

尝试正则表达式时:

From:.*<

它完全忽略了“johnsmith@gmail.com”旁边的第一个<,然后跳到<CAOiWwegy...

旁边的前一个<

我需要在正则表达式中修改哪些内容才能跳过第一个[cqlsh 5.0.1 | Cassandra 3.11.1 | CQL spec 3.4.4 | Native protocol v4] Use HELP for help. cqlsh> q ... quit ... HELP ... ! ... EXIT ... ... quit ... ! ... EXIT ...

2 个答案:

答案 0 :(得分:1)

.* 

匹配很多东西,而且它是贪婪的。

From:[\sA-Za-z]* 

可能就是你要找的东西。

From:[^<]*

答案 1 :(得分:1)

概述

您的模式From:.*<使用.**量词是贪心。这意味着它将匹配任何字符任意次数,并且只要模式满足,它将继续匹配尽可能多的字符。因此,在您的情况下,它会匹配到<的最后一次出现,因为它是如何设计的。

代码

以下几种方法可用于匹配第一次出现<From:之后)

Lazy Quantifier

此方法使量词* 延迟。这意味着它会与任何角色匹配任何次数,但尽可能少。我认为微软关于Backtracking in Regular Expressions的文档很好地解释了它:

  

当正则表达式包含可选的量词或替换时   构造,输入字符串的评估不再是线性的。 [...]因此,正则表达式引擎会尝试   完全匹配可选或替代子表达式。当它前进   到子表达式中的下一个语言元素,匹配是   不成功,正则表达式引擎可以放弃一部分   它成功的比赛并回到了早期保存的状态   将正则表达式作为整体与输入匹配的兴趣   串。这个返回先前保存状态的过程找到了   匹配被称为回溯。

See this regex in use here

From:.*?<

否定字符集

此方法使用否定字符集来匹配除给定字符之外的任何字符(在您的情况下为<)。这种方法通常被认为比使用惰性量词更好,因为它没有回溯(因此它表现更好)。比较这两种方法(并根据regex101), Lazy Quantifier 方法需要23个步骤来匹配您的字符串,而此方法只需要11个步骤来匹配相同的字符串。

See regex in use here

From:[^<]*<