.NET正则表达式 - “不”匹配

时间:2011-11-30 14:28:53

标签: 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或22222222 ...或... 999999999,则匹配。

如果不符合上述条件,我怎么能改变它? (我不能只是!不幸的是在C#中的IsMatch)...编辑,因为这是我的黑盒代码,我试图在现有的配置文件中设置正则表达式

4 个答案:

答案 0 :(得分:9)

这将匹配所有......

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

除非在字符串中找到“禁止的”序列之一。

正如您所见,

使用!isMatch

修改

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

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

答案 1 :(得分: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}部分采用数字\d\1检查此数字是否重复7次。

<强>更新

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

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

答案 2 :(得分:2)

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

现在为您解决问题。尝试使用否定前瞻:

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

这应该在不使用!IsMatch的情况下解决您的问题。

答案 3 :(得分: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

的字符串