测试字符串:
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
...
?
答案 0 :(得分:1)
.*
匹配很多东西,而且它是贪婪的。
From:[\sA-Za-z]*
可能就是你要找的东西。
或
From:[^<]*
答案 1 :(得分:1)
您的模式From:.*<
使用.*
。 *
量词是贪心。这意味着它将匹配任何字符任意次数,并且只要模式满足,它将继续匹配尽可能多的字符。因此,在您的情况下,它会匹配到<
的最后一次出现,因为它是如何设计的。
以下几种方法可用于匹配第一次出现<
(From:
之后)
此方法使量词*
延迟。这意味着它会与任何角色匹配任何次数,但尽可能少。我认为微软关于Backtracking in Regular Expressions的文档很好地解释了它:
当正则表达式包含可选的量词或替换时 构造,输入字符串的评估不再是线性的。 [...]因此,正则表达式引擎会尝试 完全匹配可选或替代子表达式。当它前进 到子表达式中的下一个语言元素,匹配是 不成功,正则表达式引擎可以放弃一部分 它成功的比赛并回到了早期保存的状态 将正则表达式作为整体与输入匹配的兴趣 串。这个返回先前保存状态的过程找到了 匹配被称为回溯。
From:.*?<
此方法使用否定字符集来匹配除给定字符之外的任何字符(在您的情况下为<
)。这种方法通常被认为比使用惰性量词更好,因为它没有回溯(因此它表现更好)。比较这两种方法(并根据regex101), Lazy Quantifier 方法需要23个步骤来匹配您的字符串,而此方法只需要11个步骤来匹配相同的字符串。
From:[^<]*<