正则表达式匹配除列出的字符串之外的其他

时间:2015-12-16 01:29:45

标签: regex

我需要选择一个未在下面的字符串中列出的值,包括所有特殊字符。

需要拒绝的字符串和要求列表:

  • XNIL
  • SNIL
  • 所有特殊字符

我的表达式就像这个(?!XNIL|SNIL|[\W])\w+

问题是,如果我的文字有单词XNILSNIL,则仍会允许单词NIL。但我列出了要被拒绝的XNILSNIL这个词。我在这里犯了什么错误?

您可以在线查看我的正则表达式 - > http://regexr.com/3cdsl

3 个答案:

答案 0 :(得分:1)

这应该有效

(M +)^(((?XNIL | SNIL |。[\ W]))*)$

将字符匹配与否定前瞻分组将导致零长度断言继续直到完成(在这种情况下由于$而在字符串的末尾)

答案 1 :(得分:1)

检查此正则表达式

[^(XNIL|SNIL|[^\w])]

解释

    开头有[]
  1. ^表示[]中列出的任何内容都不匹配。

  2. (XNIL|SNIL|[^\w+])匹配单词XNILSNIL或[^ \ w]匹配除单词以外的任何内容(即特殊字符)

  3. 因此整个正则表达式匹配[^(XNIL|SNIL|[^\w])]

  4. 中不存在的任何内容

答案 2 :(得分:1)

这似乎适用于您的测试页:(?!(XNIL|SNIL|\W+))\b\w+至少它解决了XNIL / SNIL问题。

你的正则表达式匹配XNIL的原因是它与\w+匹配。要查看原因,请将原始内容更改为\w+更改为\w并注意区别。

<强>更新

根据您的反馈,您还希望排除_

因为_用于编程语言符号,并且[可以说]正则表达式是由程序员创建的,并且由程序员创建,_被认为是&#34;单词&#34; char(即 \w中的 \W因此

来自[perl]正则表达式手册页:

  

\ w匹配&#34;字&#34;字符(字母数字加&#34; _&#34;,加上其他连接符标点字符加上Unicode标记)

您的最终正则表达式可能需要:(?!(XNIL|SNIL|_+|\W+))\b\w+。 (注意:_+

一种更清洁的方式:(?!(XNIL|SNIL|[\W_]+))\b\w+产生相同的结果,但意图更接近你想要的。

可能也必须相应地调整\w+

如果你真的想确定,而不是稍微冗长一点,请按照你的选择写出字符类:
(?!(XNIL|SNIL|[^a-zA-Z0-9]+))\b[a-zA-Z0-9]+