我需要选择一个未在下面的字符串中列出的值,包括所有特殊字符。
需要拒绝的字符串和要求列表:
我的表达式就像这个(?!XNIL|SNIL|[\W])\w+
问题是,如果我的文字有单词XNIL
或SNIL
,则仍会允许单词NIL
。但我列出了要被拒绝的XNIL
和SNIL
这个词。我在这里犯了什么错误?
您可以在线查看我的正则表达式 - > http://regexr.com/3cdsl
答案 0 :(得分:1)
这应该有效
(M +)^(((?XNIL | SNIL |。[\ W]))*)$
将字符匹配与否定前瞻分组将导致零长度断言继续直到完成(在这种情况下由于$而在字符串的末尾)
答案 1 :(得分:1)
检查此正则表达式
[^(XNIL|SNIL|[^\w])]
解释
[]
的 ^
表示[]
中列出的任何内容都不匹配。
(XNIL|SNIL|[^\w+])
匹配单词XNIL
或SNIL
或[^ \ w]匹配除单词以外的任何内容(即特殊字符)
因此整个正则表达式匹配[^(XNIL|SNIL|[^\w])]
答案 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]+