.NET 正则表达式 - "非" 匹配。

4

我有一个正则表达式:

12345678|[0]{8}|[1]{8}|[2]{8}|[3]{8}|[4]{8}|[5]{8}|[6]{8}|[7]{8}|[8]{8}|[9]{8}

如果字符串包含12345679或11111111或22222222……或999999999,则匹配此正则表达式。

如何将其更改为仅在不匹配上述内容时匹配?(不幸的是,我无法在C#中使用!IsMatch)......编辑因为对我来说那是黑盒子代码,我正在尝试在现有配置文件中设置正则表达式


8
“我不能只是!IsMatch” - 为什么? - CAbbott
我猜问题是要将“不匹配”的内容分组或类似地收集起来,或者从字符串中提取出来,比如12345678important00000000。 - Nikodemus RIP
那么 112345678 是你想匹配的吗?(注意前面多了一个 1 - ean5533
1
我不能只使用 !IsMatch,因为对我来说那是黑盒代码,而我正在尝试在现有的配置文件中设置正则表达式。 - David Ward
4个回答

10

这将匹配所有内容...

foundMatch = Regex.IsMatch(SubjectString, @"^(?:(?!123456789|(\d)\1{7}).)*$");

除非在字符串中找到一个“禁止”序列,否则不会使用!isMatch,如上所示。

编辑:

可以使用前瞻断言来添加第二个约束条件:

foundMatch = Regex.IsMatch(SubjectString, @"^(?=\d{9,12})(?:(?!123456789|(\d)\1{7}).)*$");

1
"^(?:(?!12345678|(\d)\1{7}).)*$" 工作得非常完美,非常感谢。 - David Ward
@DavidWard 不用谢。我以为你打错了12345678 :) - FailedDev
这个能否轻松扩展到限制长度在9到12个字符之间?如果可以的话,我很乐意转到另一个问题。 - David Ward
@DavidWard 如果您能告诉我您所指的“chars”是什么意思,那就有可能了。只包括数字吗?还是其他任何字符都可以? - FailedDev
好的,介于 9 和 12 个数字字符之间(即 0、1、2、3、4、5、6、7、8 或 9)。 - David Ward

2
首先,你不需要使用那些 [] 方括号;你可以直接使用 0{8}|1{8}| 等等。
现在来看看你的问题。尝试使用负向先行断言:
@"^(?:(?!123456789|(\d)\1{7}).)*$"

那应该能解决你的问题,而不需要使用 !IsMatch。

注意:我觉得原子分组比(\d)\1{7}结构更好,但我不太了解原子分组,无法让它正常工作。任何熟悉原子分组的人都可以留言评论。 - Justin Morgan
有趣。我不知道你可以量化零宽断言! - FailedDev
@FailedDev - 我的错,我漏掉了一对括号。已修复。 - Justin Morgan
那实际上在 .NET 编译通过了 :S - FailedDev
@FailedDev - 天哪,你说得对。旧版本似乎与空字符串匹配。我想知道内部发生了什么,以及前瞻是如何应用的。我猜它没有任何效果,除了可能会减慢引擎的速度。 - Justin Morgan

2

完美运作

string s = "55555555";

Regex regx = new Regex(@"^(?:12345678|(\d)\1{7})$");

if (!regx.IsMatch(s)) {
    Console.WriteLine("It does not match!!!");
}
else {
    Console.WriteLine("it matched");
}
Console.ReadLine();

顺便说一下,我稍微简化了你的表达方式,并添加了锚点。

^(?:12345678|(\d)\1{7})$

(\d)表示匹配一个数字,\1{7}表示检查这个数字是否重复出现了7次。

更新

这个正则表达式可以满足你的需求。

Regex regx = new Regex(@"^(?!(?:12345678|(\d)\1{7})$).*$");

我认为你的正则表达式仍然匹配括号中的代码。但它更短了。 - Nikodemus RIP
@David Ward 我更新了我的答案,使用这个解决方案应该可以匹配除了你不想要的任何东西。 - stema
这个几乎可以工作,但是当它不应该匹配222222222时...FailedDev下面的答案起作用了(当我将第一个规则更改为仅为12345678时)。感谢您的帮助。 - David Ward
@DavidWard 好的,看起来我的解决方案太严格了,在匹配恰好8次相同数字时会失败,但当然它会接受9次重复。 - stema

0
很遗憾,我不能在C#中使用!IsMatch。
为什么?以下解决方案有什么问题吗?
bool notMatch = !Regex.Match(yourString, "^(12345678|[0]{8}|[1]{8}|[2]{8}|[3]{8}|[4]{8}|[5]{8}|[6]{8}|[7]{8}|[8]{8}|[9]{8})$");

这将匹配包含不只 1234567811111111、…、99999999 的任何字符串


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