^在正则表达式中引起一些麻烦

时间:2013-05-28 10:44:26

标签: .net regex regex-negation negative-lookahead

我正在尝试将子字符串与正则表达式匹配,但^会改变逻辑,因为我没想到。 正则表达式......

      ^(?!My Words).*$

拒绝以My Words开头的句子。在这种情况下,负向前瞻检查整个单词。 但是,如果我放弃^那么

    (?!My Words).*$

正则表达式只返回包含y Words lskjdf的句子中的My Words lskjdf。在这种情况下,为什么负面预测不会作为一个整体进行处理?为什么它只选择匹配的M^(?1如何共同合作?

2 个答案:

答案 0 :(得分:2)

^(?!My Words).*$

^(?!表示查找字符串的开头或带有多行标志的行,后面没有...

这就是为什么使用^锚时,以“我的话”开头的任何句子都不匹配。

删除y Words锚点时^匹配的原因是,现在您只是在查找字符串中没有跟My Words后面的任何点,这与位置匹配在M之后。

让我们看一下字符串My Words以及如何应用(?!My Words).*$

请记住,^是字符串的开头,即使你没有把它放在你的正则表达式中,正则表达式引擎仍然会在那个位置启动。我会简化它的工作原理。

第一个正则表达式引擎步骤:

^My Words
|
Regex engine starts here, and looks if the current position onwards
matches (?!My Words), which it does not.   

第二步:

^My Words
 |
 Regex engine evaluates the 'M', and finds that from this position
 onwards also fails to match (?!My Words)

第三步:

^My Words
  |
  Standing at 'y', it finds that the lookahead now does not match 'My Words'.
  This allows the rest of the pattern '.*$' to be applied, which matches
  from 'y' till end of string.

答案 1 :(得分:1)

这是因为^使用必须来匹配字符串的开头

如果没有^,它会匹配字符串之间的任何地方,因此它会匹配y Words lskjdf