【问题标题】:Regex that matches a pattern and doesn't match specific words匹配模式但不匹配特定单词的正则表达式
【发布时间】:2017-04-28 05:22:21
【问题描述】:

对于包含至少一个字母的任何字符串,我都有我的基本 javascript 正则表达式:

^(.*[A-Za-z]+.*)+

现在我想更新这个正则表达式,使其与以下单词不匹配:“n\a”和“none”。包含它们是有效的,意味着“n\aa”或“nn\a”是有效的,只有与我不想要的词完全匹配的词才会导致正则表达式不匹配。

我看到很多不包含特定字符串的单词的例子都使用了否定的向后看,比如

^(?!.*bar).*$

但我无法将其转换为完全匹配。

【问题讨论】:

  • 试试^(\bn/a\b|\bnone\b)
  • 试试/^(?![\s\S]*\b(?:n\\a|none)\b)[^a-z]*[a-z][\s\S]*$/i
  • 你想匹配单词还是只是测试/验证?
  • 至少包含一个字母 alphabet 是一组用于书写语言的书写符号,例如用于书写英语的罗马字母。您的意思是“字母”或“字母字符”。关于你的正则表达式,我不确定^ 和括号和.* 的含义——它完全等同于写/a-z/i。顺便问一下,\a 是什么意思?您的意思是文字反斜杠后跟“a”吗?

标签: javascript regex


【解决方案1】:

(?!) 实际上是负前瞻。但你是对的,它在这里拥有关键:

^(?!n\\a$)(?!none$)(.*[A-Za-z].*)

基本上,从开头 (^) 开始,我们希望确保到结尾 ($) 字符串不只由这两个组成。

为了不区分大小写,您只需添加 i 正则表达式标志:

'NONE'.match(/^(?!n\\a$)(?!none$)(.*[A-Za-z].*)/)  // => ["NONE", "NONE"]
'NONE'.match(/^(?!n\\a$)(?!none$)(.*[A-Za-z].*)/i) // => null

See it in action

另请注意,您的原始正则表达式不需要+s,因为匹配一个已经确保至少存在一个。

【讨论】:

  • 其实所有+在原始模式中都是多余的。
  • 感谢原版的更正以及完美快速的分析器
  • @RotemB,很乐意为您提供帮助。
  • @ndn,我怎样才能使这个正则表达式不区分大小写?
  • @RotemB,在构造正则表达式时,添加i 标志。又名/regex-here/i.
猜你喜欢
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多