我尝试过滤不包含单词"spam“的字符串。我使用来自here的正则表达式!
但是我不明白为什么我在表达式的开头需要符号^。我知道它标志着正则表达式的开始,但我不明白为什么在我的例子中没有^它就不能工作?
UPD。下面的所有答案都非常有用。现在完全清楚了。谢谢!
发布于 2019-02-11 15:50:36
正则表达式(?!.*?spam)匹配字符串中后面没有匹配.*?spam的位置。
每个字符串都有这样的位置,因为如果没有其他位置,字符串的末尾肯定不会跟任何与.*?spam匹配的内容。
因此,每个字符串都包含一个与正则表达式(?!.*?spam)匹配的字符串。
^(?!.*?spam)中的锚定^限制了正则表达式,以便它只匹配字符串开头没有任何匹配.*?spam的字符串-即根本不包含spam的字符串(或者至少第一行中的任何位置,这取决于.是否匹配换行符)。
发布于 2019-02-11 15:47:32
lookahead是一个零宽度断言(也就是说,它确保了字符串中的位置)。在你的例子中,它是一个负面的先行检查,确保后面不会有“零个字符,后面跟着垃圾邮件”。这对于字符串中的几个位置是正确的,请参见无锚点的。
有了锚点,匹配过程就从一开始就开始了,所以整个字符串都会被分析,参见regex101.com上的。
https://stackoverflow.com/questions/54625955
复制相似问题