C# .NET正则表达式-“;不是";匹配

C# .NET正则表达式-“;不是";匹配,c#,.net,regex,C#,.net,Regex,我有一个正则表达式: 12345678|[0]{8}|[1]{8}|[2]{8}|[3]{8}|[4]{8}|[5]{8}|[6]{8}|[7]{8}|[8]{8}|[9]{8} 如果字符串包含12345679或11111111或2222,则匹配。。。或999999999 如果不符合上述条件,我如何将其更改为仅匹配?(很遗憾,我不能在C#中仅使用!IsMatch)…编辑,因为这对我来说是黑盒代码,我正在尝试在现有配置文件中设置正则表达式 我不能就这样!不幸的是,C#中的IsMatch 为什么不

我有一个正则表达式:

12345678|[0]{8}|[1]{8}|[2]{8}|[3]{8}|[4]{8}|[5]{8}|[6]{8}|[7]{8}|[8]{8}|[9]{8}
如果字符串包含12345679或11111111或2222,则匹配。。。或999999999

如果不符合上述条件,我如何将其更改为仅匹配?(很遗憾,我不能在C#中仅使用!IsMatch)…编辑,因为这对我来说是黑盒代码,我正在尝试在现有配置文件中设置正则表达式

我不能就这样!不幸的是,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})$");
这将匹配任何包含不只是
12345678
11111111
,…,
9999999
的字符串

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}
部分获取一个数字
\d
,然后
\1
检查该数字是否重复7次

更新

这个正则表达式正在做你想做的事情

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

这将匹配一切

foundMatch = Regex.IsMatch(SubjectString, @"^(?:(?!123456789|(\d)\1{7}).)*$");
除非在字符串中找到一个“禁止”序列

不使用
!isMatch
如您所见

编辑:

添加第二个约束可以通过前瞻断言完成:

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

首先,您不需要任何
[]
括号;你可以做
0{8}| 1{8}|
等等

现在来解决你的问题。尝试使用消极前瞻:

@"^(?:(?!123456789|(\d)\1{7}).)*$"

这将解决您的问题,而无需使用
!IsMatch
“/p>“我不能只进行!IsMatch”-为什么不?我想问题是在组或类似的组中收集“不匹配”或将其从类似的字符串中取出,例如12345678import0000000,所以
112345678
您想匹配的东西吗?(注意前面额外的
1
)我不能这么做!IsMatch因为这对我来说是黑盒代码,我正在尝试在现有配置文件中设置正则表达式。我认为您的正则表达式仍然与括号中的代码匹配。但是它更短了。@David Ward我用一个解决方案更新了我的答案,这个解决方案应该匹配除你不想要的以外的任何东西。这几乎奏效了,但在不应该的时候匹配了22222。下面的FailedDev答案奏效了(当我将第一条规则更改为仅12345678时)。谢谢你的帮助help@DavidWard好的,看来我的解决方案太严格了,它不能精确匹配同一个数字的8倍,但它当然可以接受9次重复。注意:我觉得原子分组比
(\d)\1{7}
构造更好,但我对原子组了解不够,无法让它工作。欢迎有兴趣的人发表评论。我不知道您可以量化零宽度断言@FailedDev-我的错,我漏掉了一对括号。已修复。实际在.net中编译的:S@FailedDev-天哪,你说得对。旧版本似乎与空字符串匹配。我想知道内部发生了什么,以及如何应用前瞻性。我的猜测是,除了可能使发动机减速之外,它没有任何效果。”^(?((?!12345678 |)(\d)\1{7})。*$”非常有效,谢谢much@DavidWard不客气。我以为你输入了12345678:)这可以很容易地扩展到长度限制在9到12个字符之间吗很高兴搬到另一个地方question@DavidWard是的,如果你告诉我你所说的chars是什么意思的话。只有数字?还是什么?很好,9到12个数字字符(即0,1,2,3,4,5,6,7,8或9)