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

mec1mxoz  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(116)

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

[a-df-moq-z]

我只是想知道是否有一种方法可以写类似([a-z except ^enp])的东西,只是为了让正则表达式更容易破译哪些字符被排除在外。

igsr9ssn

igsr9ssn1#

你可以像这样使用负lookahead:

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

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

  • 这意味着匹配a-z范围内的任何字符,除非字符是[enp]之一。
  • (?![enp])是一个negative lookahead expression,当我们在下一个位置有字母enp时,它匹配失败,
vfwfrxfs

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风格接近实现它的所有建议。

1qczuiv0

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应该可以。

相关问题