是否可以编写正则表达式来检查:

时间:2010-10-22 14:49:58

标签: c# regex

是否可以编写正则表达式来检查特定10位数的所有数字是否发生了3次? 例如Regex.IsMatch("xxxx", "4433425425")的返回值为false。 并且Regex.IsMatch("xxxx", "4463322545")是真的。什么是xxxx? 在第一个中,我有4 occurrence个数字4,而在第二个数字中,没有数字的数字超过3次。

3 个答案:

答案 0 :(得分:7)

将匹配任何具有四个或更多实例的数字

 string found =  Regex.Match(s,@"(\d).*\1.*\1.*\1").Groups[1].Value;

只是一个如何使用它的例子

static void Main( string[] args )
{
     string fail = "1234567890";
     string s = "1231231222";
     string mTxt = @"(\d).*\1.*\1.*\1";
     Console.WriteLine( Regex.Match(s,mTxt).Success);
     Console.WriteLine(Regex.Match(fail, mTxt).Success);
}

@Brads上的评论下面的评论使用

([0-9]).*\1.*\1.*\1

答案 1 :(得分:3)

查找连续三次出现的数字:

(?=(0{3}|1{3}|2{3}|3{3}|4{3}|5{3}|6{3}|7{3}|8{3}|9{3}).{3}

查找字符串中任意位置出现三次的数字:

(.?0.?){3}|(.?1.?){3}|(.?2.?){3}|(.?3.?){3}|(.?4.?){3}|(.?5.?){3}|(.?6.?){3}|(.?7.?){3}|(.?8.?){3}|(.?9.?){3}

使用反向引用(C / O @rerun):

([0-9]).*\1.*\1.*

注意:这将检查整个字符串是否有多个字符。字符串中的前10个字符没有限制。如果您需要,请告诉我。

答案 2 :(得分:1)

我将冒险在这里冒险,并建议正则表达式很可能不是这项工作的最佳工具。

他们有他们的位置,但我通常会发现,如果你进入“可怕的”领域有多个回溯或负向前瞻和许多or条款,你可能最好扔掉整个正则表达式想法和编写一个简单的字符串扫描功能,只需计算每个数字,并确保计数在最后是正确的。伪代码如下:

def isValid (str):
    foreach ch in '0'..'9':
        count[ch] = 0
    foreach ch in str:
        if ch not in '0'..'9':
            return false
        count[ch] = count[ch] + 1
    foreach ch in '0'..'9':
        if count[ch] > 3:
            return false
    return true

这是我的建议,接受或离开,我不会被冒犯: - )