我想写一个正则表达式来匹配除了e,n p之外的字符a-z。我可以这样写:
[a-df-moq-z]
我只是想知道是否有一种方法可以写类似([a-z except ^enp])的东西,只是为了让正则表达式更容易破译哪些字符被排除在外。
igsr9ssn1#
你可以像这样使用负lookahead:
(?![enp])[a-z]
现场演示:http://www.rubular.com/r/1LnJswio3F说明:
a-z
[enp]
(?![enp])
e
n
p
vfwfrxfs2#
有几种方法可以做到这一点,这取决于你使用的正则表达式的风格。@anubhava的解决方案是最可移植的,因为它可以在任何支持lookaheads的风格中工作。如果你想匹配整个单词或整个字符串,你需要将该正则表达式 Package 在一个组中,迫使正则表达式引擎将整个事物视为一个原子:
/\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]]
..或集合减法(.NET):
[a-z-[enp]]
Unicode联盟对所有这些集合算术的东西都非常狂热,但据我所知,现实世界中还没有任何regex风格接近实现它的所有建议。
1qczuiv03#
您可以使用[^[^a-z]enp],它可以工作,但理解起来有点混乱。[^a-z]enp定义了一个类,它包含了a-z以外的所有字符,并添加了e、n和p。然后通过反转这个类,你得到了一个匹配a-z的类,除了e、n和p。你可以试试http://www.rubular.com/r/VEZNFgxgfI
[^[^a-z]enp]
[^a-z]enp
更新:但在JavaScript(测试过的Chrome)中似乎不起作用。Ruby和PCRE应该可以。
3条答案
按热度按时间igsr9ssn1#
你可以像这样使用负lookahead:
现场演示:http://www.rubular.com/r/1LnJswio3F
说明:
a-z
范围内的任何字符,除非字符是[enp]
之一。(?![enp])
是一个negative lookahead expression,当我们在下一个位置有字母e
或n
或p
时,它匹配失败,vfwfrxfs2#
有几种方法可以做到这一点,这取决于你使用的正则表达式的风格。@anubhava的解决方案是最可移植的,因为它可以在任何支持lookaheads的风格中工作。
如果你想匹配整个单词或整个字符串,你需要将该正则表达式 Package 在一个组中,迫使正则表达式引擎将整个事物视为一个原子:
另一种可能性是扫描整个单词/字符串,以确保它不包含任何不需要的字符,然后以通常的方式匹配它:
这一切都是相当的黑客,但在JavaScript中,这是你所坚持的。其他一些风格提供了专门用于此目的的工具,如set intersection(Java,Ruby 1.9.x):
..或集合减法(.NET):
Unicode联盟对所有这些集合算术的东西都非常狂热,但据我所知,现实世界中还没有任何regex风格接近实现它的所有建议。
1qczuiv03#
您可以使用
[^[^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应该可以。