我想写一个正则表达式来匹配字符a-z,除了e,n p。我可以写:
[a-df-moq-z]
我只是想知道是否有办法编写类似([a-z除了^ enp]之类的东西)只是为了让正则表达式更容易破译哪些字符被排除。
答案 0 :(得分:14)
答案 1 :(得分:2)
有几种方法可以做到这一点,具体取决于您使用的正则表达方式。 @anubhava's solution是最便携的,因为它适用于支持前瞻的任何风格。
如果要匹配整个单词或整个字符串,则需要将该正则表达式包装在一个组中,强制正则表达式引擎将整个单词视为一个原子:
/\b(?:(?![enp])[a-z])+\b/
/^(?:(?![enp])[a-z])+$/
另一种可能性是扫描整个单词/字符串以确保它不包含任何不需要的字符,然后以通常的方式匹配它:
/\b(?!\w*[enp])[a-z]+\b/
/^(?!\w*[enp])[a-z]+$/
这一切都非常讨厌,但在JavaScript中,这就是你所坚持的。其他一些版本提供专门用于此目的的工具,如set intersection(Java,Ruby 1.9.x):
[a-z&&[^enp]]
..或set subtraction(.NET):
[a-z-[enp]]
Unicode Consortium已经习惯了所有这些算术的东西,但据我所知,现实世界的正则表达式并没有实现其所有提议。
答案 2 :(得分:0)
你可以使用[^[^a-z]enp]
,但有点令人困惑。
[^a-z]enp
定义一个类,其中包含非a-z的所有字符并添加e,n和p。然后通过反转该类,您将得到一个与a-z匹配的类,e,n和p除外。
您可以在http://www.rubular.com/r/VEZNFgxgfI
尝试更新:但它似乎无法在JavaScript中运行(经过测试的Chrome)。 Ruby和PCRE应该可行。