我正在尝试将子字符串与正则表达式匹配,但^会改变逻辑,因为我没想到。 正则表达式......
^(?!My Words).*$
拒绝以My Words
开头的句子。在这种情况下,负向前瞻检查整个单词。
但是,如果我放弃^
那么
(?!My Words).*$
正则表达式只返回包含y Words lskjdf
的句子中的My Words lskjdf
。在这种情况下,为什么负面预测不会作为一个整体进行处理?为什么它只选择匹配的M
? ^
和(?1
如何共同合作?
答案 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