26

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

想到的唯一想法是在每个字符周围使用负前瞻/后视,但是当我实际上只想将一个字符与正匹配和负匹配进行匹配时,这似乎比必要的复杂。例如,如果 & 是 AND 运算符,我可以这样做......

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

5 回答 5

25

这真的取决于你的正则表达式风格。

。网

...仅提供一种简单的字符类集操作:减法。这对于您的示例来说已经足够了,因此您可以简单地使用

[\w-[_]]

如果 a-后跟一个嵌套字符类,则将其减去。就那么简单...

爪哇

... 提供更丰富的字符类集操作集。特别是,您可以获得两组的交集,例如[[abc]&&[cde]]c在这种情况下会给出)。交集和否定一起给你减法:

[\w&&[^_]]

Perl

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

(?[ \w - [_] ])

所有其他口味

...(支持前瞻)允许您通过使用负前瞻来模拟减法:

(?!_)\w

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

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

于 2013-06-26T18:48:07.567 回答
12

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

^([^\W_]+)$
于 2013-06-26T18:38:27.517 回答
11

就我理解您的问题而言,消极的前瞻是正确的方法:

^((?!_)\w)+$
于 2013-06-26T18:30:45.547 回答
7

这可以使用regex 模块在python中完成。就像是:

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

您通常会使用pip安装 regex 模块:

pip install regex

编辑

正则表达式模块有两种行为,版本 0 和版本 1。设置减法(如上)是版本 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_--[ ]]+')
于 2016-08-18T18:04:27.100 回答
5

尝试使用减法:

[\w&&[^_]]+

注意:这适用于 Java,但可能不适用于其他 Regex 引擎。

于 2013-06-26T18:30:27.613 回答