有没有一种简单的方法可以匹配类中除了某一组字符之外的所有字符?例如,如果在一个我可以使用\w来匹配所有unicode单词字符集的语言中,有没有办法从匹配中排除下划线"_"之类的字符?
我想到的唯一想法是在每个角色周围使用负向前/向后看,但当我实际上只想将角色与正匹配和负匹配进行匹配时,这似乎比必要的更复杂。例如,如果&是AND运算符,我能做到。。。
^(w&[^_])+$
这实际上取决于正则表达式的风格。
.NET
只提供了一个简单的字符类集操作:减法。这对你的例子来说已经足够了,所以你可以简单地使用
[w-[_]]
如果-
后面跟有一个嵌套的字符类,则会减去它。就这么简单。。。
Java
提供了一组更加丰富的字符类集操作。特别是,你可以得到两个集合的交集,比如[[abc]&&[cde]]
(在这种情况下会得到c
)。交集和否定一起给你减法:
[w&&[^_]]
Perl
作为一项实验功能,支持对扩展字符类进行设置操作(从Perl5.18开始提供)。特别是,您可以直接减去任意字符类:
(?[ w - [_] ])
所有其他口味
(支持lookahead)允许您通过使用负lookahead来模拟减法:
(?!_)w
这首先检查下一个字符是否不是_
,然后匹配任何w
(由于负前瞻性,不可能是_
)。
请注意,这些方法中的每一种都是完全通用的,因为您可以减去两个任意复杂的字符类。
您可以使用w
类(-->W
)的否定并排除它:
^([^W_]+)$
就我理解你的问题而言,消极展望是正确的方法:
^((?!_)w)+$
这可以在python中使用regex模块完成。类似于:
import regex as re
pattern = re.compile(r'[W_--[ ]]+')
cleanString = pattern.sub('', rawString)
您通常会使用pip:安装regex模块
pip install regex
编辑:
regex模块有两种行为,版本0和版本1。Set substraction(如上所述)是版本1的行为。pypi文档声称版本1是默认行为,但您可能会发现事实并非如此。您可以使用进行检查
import regex
if regex.DEFAULT_VERSION == regex.VERSION1:
print("version 1")
将其设置为版本1:
regex.DEFAULT_VERSION = regex.VERSION1
或者在单个表达式中使用版本一:
pattern = re.compile(r'(?V1)[W_--[ ]]+')
尝试使用减法:
[w&&[^_]]+
注意:这将在Java中工作,但可能在其他Regex引擎中不起作用。