【问题标题】:Why the character ^ is required in an regex ^(?!.*?spam) to filter strings?为什么在正则表达式 ^(?!.*?spam) 中需要字符 ^ 来过滤字符串?
【发布时间】:2019-02-11 16:06:13
【问题描述】:

我尝试过滤不包含“垃圾邮件”一词的字符串。 我使用来自here的正则表达式!

但我不明白为什么我需要在表达式开头使用符号 ^。我知道它标志着正则表达式的开始,但我不明白为什么没有 ^ 在我的情况下它不起作用?

UPD。下面的所有答案都非常有用。 现在完全清楚了。谢谢!

【问题讨论】:

  • 因为没有它,字符串的最后一个字符将单独匹配模式,例如spam中的m(或spam中的am,或spam中的pam )。您需要确保spam 不会出现在字符串中的任何地方,而不是让被测子字符串的开头向前跟踪。
  • 很容易看出,没有^的正则表达式匹配字符串中的任何单个字符。
  • 如果对您有帮助,请考虑接受答案(左侧的绿色勾号)。
  • 在很多情况下不需要它,因为许多验证任务都是使用仅针对正则表达式一次测试输入字符串的方法执行的。但是,这是最佳实践,因为正则表达式可能与搜索所有出现的方法一起使用。

标签: regex


【解决方案1】:

正则表达式 (?!.*?spam) 匹配字符串中的位置,该位置 not 后跟匹配 .*?spam 的内容。

每一个字符串都有这样的位置,因为如果没有别的,字符串的最后肯定不会有任何匹配.*?spam的东西。

所以每个字符串都包含一个匹配正则表达式(?!.*?spam)

^(?!.*?spam) 中的锚点^ 限制了正则表达式,因此它只匹配字符串的最开头 后面没有任何匹配.*?spam 的字符串——即字符串根本不包含spam(或第一行中的任何位置,至少,取决于. 是否与换行符匹配)。

【讨论】:

    【解决方案2】:

    前瞻是一个零宽度的断言(也就是说,它确保了字符串中的 位置)。在您的情况下,这是一个否定的前瞻,确保后面没有“零个字符,后跟垃圾邮件”。这适用于字符串中的几个位置,请参阅 a demo on regex101.com without 锚。

    使用锚点,匹配过程从一开始就开始,所以整个字符串都被分析了,参见 regex101.com 上的the altered demo

    【讨论】:

      猜你喜欢
      • 2012-10-13
      • 1970-01-01
      • 2014-01-29
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多