12

I want to write a regex to match characters a-z except for e, n p. I can write:

[a-df-moq-z]

I'm just wondering if there's a way to write something like ([a-z except ^enp]) just to make the regex more easy to decipher which characters are excluded.

4

3 回答 3

21

您可以像这样使用负前瞻:

(?![enp])[a-z]

现场演示:http ://www.rubular.com/r/1LnJswio3F

于 2013-05-28T13:18:40.640 回答
2

有几种方法可以做到这一点,具体取决于您使用的正则表达式风格。 @anubhava 的解决方案是最便携的,因为它适用于任何支持前瞻的风格。

如果要匹配整个单词或整个字符串,则需要将该正则表达式包装在一个组中,从而强制正则表达式引擎将整个事物视为一个原子:

/\b(?:(?![enp])[a-z])+\b/

/^(?:(?![enp])[a-z])+$/

另一种可能性是扫描整个单词/字符串以确保它不包含任何不需要的字符,然后以通常的方式匹配它:

/\b(?!\w*[enp])[a-z]+\b/

/^(?!\w*[enp])[a-z]+$/

这一切都非常老套,但在 JavaScript 中,这就是你所坚持的。其他一些风格专门为此目的提供了工具,例如设置交集(Java,Ruby 1.9.x):

[a-z&&[^enp]]

..或设置减法(.NET):

[a-z-[enp]]

Unicode 联盟已经对所有这些集合算术的东西发疯了,但据我所知,没有任何现实世界的正则表达式风格能够实现它的所有提议。

于 2013-05-28T14:23:06.150 回答
1

您可以使用[^[^a-z]enp]which 有效,但理解起来有点混乱。

[^a-z]enp定义一个包含所有非 az 字符并添加 e、n 和 p 的类。然后通过反转该类,您得到一个与除 e、n 和 p 之外的 az 匹配的类。

你可以在这里试试http://www.rubular.com/r/VEZNFgxgfI

更新:但它似乎不适用于 JavaScript(经过测试的 Chrome)。Ruby 和 PCRE 应该可以工作。

于 2013-05-28T13:47:08.827 回答