Regex 从字符类中排除字符

Regex 从字符类中排除字符,regex,set-difference,character-class,Regex,Set Difference,Character Class,是否有一种简单的方法来匹配一个类中除某一组字符外的所有字符?例如,如果在一种可以使用\w匹配所有unicode单词字符集的语言中,是否有方法仅从该匹配中排除下划线“\u1”之类的字符 我唯一想到的想法是在每个角色周围使用消极的前/后看,但当我实际上只想将角色与积极匹配和消极匹配进行匹配时,这似乎比必要的更复杂。例如,如果&是一个AND运算符,我可以这样做 ^(\w&[^_])+$ 尝试使用减法: [\w&&[^_]]+ [\w&&[^_]] 注意:这

是否有一种简单的方法来匹配一个类中除某一组字符外的所有字符?例如,如果在一种可以使用\w匹配所有unicode单词字符集的语言中,是否有方法仅从该匹配中排除下划线“\u1”之类的字符

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

^(\w&[^_])+$
尝试使用减法:

[\w&&[^_]]+
[\w&&[^_]]

注意:这将在Java中工作,但在其他一些正则表达式引擎中可能不起作用

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

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

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

^([^\W_]+)$

这真的取决于你的正则表达式的味道

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

[\w-[_]]
如果
-
后跟嵌套字符类,则会将其减去。就这么简单

JAVA 。。。提供了一组更丰富的数据。特别是,您可以获得两个集合的交集,如
[[abc]&&&[cde]]
(在本例中,这将给出
c
)。求交和求反结合在一起可以得到减法:

[\w&&[^_]]+
[\w&&[^_]]
Perl 。。。支持将上的设置操作作为实验特性(从Perl 5.18开始提供)。特别是,可以直接减去任意字符类:

(?[ \w - [_] ])
所有其他口味 。。。(支持lookaheads)允许您通过使用负前瞻模拟减法:

(?!_)\w
这将首先检查下一个字符是否不是
\u
,然后匹配任何
\w
(由于负向前看,不能是
\u


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

这可以在python中使用。比如:

import regex as re
pattern = re.compile(r'[\W_--[ ]]+')
cleanString = pattern.sub('', rawString)
您通常会使用以下内容安装regex模块:

编辑

正则表达式模块有两种行为,版本0和版本1。集合减法(如上所述)是版本1的行为。pypi文档声明版本1是默认行为,但您可能会发现情况并非如此。你可以跟我核对一下

import regex
if regex.DEFAULT_VERSION == regex.VERSION1:
  print("version 1")
要将其设置为版本1,请执行以下操作:

regex.DEFAULT_VERSION = regex.VERSION1
或在单个表达式中使用版本1:

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

你用的是哪种口味的正则表达式?(例如Perl、Java等)什么正则表达式风格/语言?在.NET中,您可以使用
[\w-[\u]]
来排除下划线。我最常用的正则表达式引擎是基于java的,尽管是一个旧的实现(无论CF8在引擎盖下使用什么)。然而,我在javascript和python中也有这种需求。你是说ColdFusion?这是基于JavaScript的,而不是Java。而且它的
\w
只识别ASCII单词字符(
[A-Za-z0-9\
),而不是完整的Unicode集。Python内置的
re
flavor.Creative也是如此,但我不认为OP期望得到这种答案,他希望在一般情况下排除字符。好主意though@CasimiretHippolyte我应该想到这一点。哈姆扎说得对,我在寻找一个更一般的案例,但是哇\P谢谢你指出这一点,因为我从来没有用过。@Casimirithippolyte并非所有情况。这不能用于从范围中排除字符;)。并非所有的RE引擎都支持这一点。@DonalFellows“那”是什么意思?否定字符类?版本1位上的救生圈。否则我会发疯的。