使用正则表达式的字符类和否定

5

我在想是否有一种正则表达式的方式,可以接受与给定字符集相关联的字符,同时排除其他几个字符?

例如,考虑这样一个情况:我想接受所有字符、数字和下划线 (\w),但排除字母e和数字1。有没有一种快速实现的方法?理想情况下,我希望像 ^[\w^e1]$ 这样的东西,虽然我知道这个具体的正则表达式不会起作用。


2
我相当确定你的问题没有答案(但希望我错了),但这绝对是一个真正的问题。不确定为什么有人会投反对票。 - JaredPar
2个回答

6
你可以通过字符类减法来实现这一点:

[基础组 - [排除组]]

使用这种格式,可以使用模式^[\w-[e1]]$来匹配所有字母数字字符,但不包括字母e和数字1

string[] inputs = 
{
    "a", "b", "c", "_", "2", "3",
    " ", "1", "e"   // false cases
};
string pattern = @"^[\w-[e1]]$";
foreach (var input in inputs)
{
    Console.WriteLine("{0}: {1}", Regex.IsMatch(input, pattern), input);
}

3
此处仅作免责声明:大多数正则表达式引擎不支持此功能。在使用.NET时没问题,但如果您在其他地方使用正则表达式时请注意此事。 - Jason Larke
@JasonLarke,这是真的。参考一下正则表达式口味比较图表可以看出哪些口味支持此功能(非常有限)。 - Ahmad Mageed
太棒了。不过我还有一个问题。当尝试用*[a-z](或任何其他字符集)替换\w*时,它将无法匹配任何内容。有什么具体原因吗?啊,算了。你提供的链接回答了我的问题。不过我想知道为什么他们没有遵循我想象中更自然的变体I呢。 - devoured elysium
@devouredelysium 这是不可能的。字符类会改变某些正则表达式元字符的行为。在字符类之外,.匹配任何字符,但在其中它匹配一个字面上的点或句号。同样的规则也适用于量词。Regex.Escape方法的文档提到了通常受影响的元字符。 - Ahmad Mageed
1
一定要记录下你所做的工作(如果与其他开发人员一起使用)。由于支持有限,乍一看这可能会被误认为是一个字符范围(而不是减法)! - Kenneth K.

0
一个比Ahmad的解决方案更加可移植但不够简洁的方法是定义一个字符类,其中排除e1
[a-df-zA-DF-Z02-9]

应如预期工作。


在.NET正则表达式中,\w匹配Ll、Lu、Lt、Lo、Lm、Nd和Pc类别中的所有Unicode字符。这些字符太多了,无法明确列出。 - dtb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接