除了字符e,n,p之外,是否有更简洁的正则表达式匹配a-z?

时间:2013-05-28 13:15:57

标签: javascript regex

我想写一个正则表达式来匹配字符a-z,除了e,n p。我可以写:

[a-df-moq-z]

我只是想知道是否有办法编写类似([a-z除了^ enp]之类的东西)只是为了让正则表达式更容易破译哪些字符被排除。

3 个答案:

答案 0 :(得分:14)

你可以使用这样的负向前瞻:

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

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

答案 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应该可行。