代码之家  ›  专栏  ›  技术社区  ›  Saeed Amiri

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

  •  3
  • Saeed Amiri  · 技术社区  · 14 年前

    是否可以编写正则表达式来检查 10 数字最多出现3次? 例如返回值 Regex.IsMatch("xxxx", "4433425425") 是假的。 为了 Regex.IsMatch("xxxx", "4463322545") 在我的第一个 4 occurrence 位数 4 在第二个数字中,非数字出现的次数超过 3

    3 回复  |  直到 14 年前
        1
  •  7
  •   paxdiablo    14 年前

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

     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
    
        2
  •  3
  •   Brad    14 年前

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

    (?=(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}

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

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

        3
  •  1
  •   paxdiablo    14 年前

    我将冒着被否决的风险,建议regex很可能不是这项工作的最佳工具。

    他们有自己的位置,但我通常发现,如果你进入“可怕的”领域,有多个回溯或负面展望,以及 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