从字符类中排除字符

时间:2013-06-26 18:28:27

标签: regex set-difference character-class

是否有一种简单的方法可以匹配某个类中的所有字符,除了它们中的某一组?例如,如果在我可以使用\ w来匹配所有unicode单词字符集的语言中,有没有办法从该匹配中排除像下划线“_”这样的字符?

只有想到的想法是在每个角色周围使用负向前瞻/后面但是当我有效地想要将角色与正匹配和负匹配匹配时,这似乎比必要更复杂。例如,如果&是一个AND运算符,我可以这样做......

^(\w&[^_])+$

5 个答案:

答案 0 :(得分:17)

这实际上取决于你的正则表达方式。

.NET

...只提供一个简单的字符类集操作:subtraction。这足以满足您的示例,因此您只需使用

即可
[\w-[_]]

如果-之后是嵌套的字符类,则将其减去。很简单...

爪哇

...提供了更丰富的character class set operations。特别是你可以获得两个集合的交集,例如[[abc]&&[cde]](在这种情况下会给出c)。交叉和否定一起给你减法:

[\w&&[^_]]

的Perl

...支持extended character classes上的设置操作作为实验性功能(自Perl 5.18起可用)。特别是,您可以直接减去任意字符类:

(?[ \w - [_] ])

所有其他口味

...(支持前瞻)允许您使用否定前瞻模仿减法:

(?!_)\w

首先检查下一个字符是否不是_,然后匹配任何\w(由于否定前瞻而不能_。)

请注意,这些方法中的每一种都是完全一般的,因为您可以减去两个任意复杂的字符类。

答案 1 :(得分:8)

您可以使用\w类的否定( - > \W)并排除它:

^([^\W_]+)$

答案 2 :(得分:6)

在我理解你的问题的情况下,一个消极的先行是正确的方式:

^((?!_)\w)+$

答案 3 :(得分:5)

尝试使用减法:

[\w&&[^_]]+

注意:这可以在Java中使用,但在其他一些Regex引擎中可能不行。

答案 4 :(得分:4)

这可以使用regex module python 中完成。类似的东西:

import regex as re
pattern = re.compile(r'[\W_--[ ]]+')
cleanString = pattern.sub('', rawString)

您通常使用pip安装正则表达式模块:

pip install regex

修改

正则表达式模块有两个行为,版本0和版本1.设置减法(如上所述)是版本1行为。 pypi docs声明版本1是默认行为,但您可能会发现情况并非如此。您可以查看

import regex
if regex.DEFAULT_VERSION == regex.VERSION1:
  print("version 1")

将其设置为版本1:

regex.DEFAULT_VERSION = regex.VERSION1

或在单个表达式中使用第一版:

pattern = re.compile(r'(?V1)[\W_--[ ]]+')