【问题标题】:regex: do not allow character appear more than 2 consecutively正则表达式:不允许字符连续出现超过 2 个
【发布时间】:2015-05-04 04:49:40
【问题描述】:

我想要一个正则表达式来做到这一点。

  • 字符串 = 12345 => 真
  • string = 11145 => false,因为我们不允许任何字符连续出现,这个例子是1。
  • string = aaa664 => false,是因为a。

我需要正则表达式来处理字符和数字,请帮忙。

【问题讨论】:

标签: regex


【解决方案1】:
^(?!.*(.)\1+).*$

这应该适合你。参见演示。lookahead 确保没有 . 再次重复。

https://regex101.com/r/uE3cC4/21

【讨论】:

  • 你好,我只能检测到 111aa ,那是在字符串的前面,那在字符串的中间,即 aa111 呢?
  • @user2617403 它将在所有级别进行检测。参见演示。
【解决方案2】:

您通常可以使用捕获组和反向引用来检测连续字符。比如在grep:

$ echo abc | grep '\([a-z]\)\1'

$ echo abbc | grep '\([a-z]\)\1'
abbc

您要查找的内容周围的括号捕获结果匹配部分,然后此部分替换正则表达式其余部分中的\1

就您的具体测试用例而言,见下文:

$ echo 12345 | grep '\([a-zA-Z0-9]\)\1' >/dev/null; echo $?
1
$ echo 11145 | grep '\([a-zA-Z0-9]\)\1' >/dev/null; echo  $?
0
$ echo aaa664 | grep '\([a-zA-Z0-9]\)\1' >/dev/null; echo $?
0

您可以看到 1 表示成功的字符串,0 表示错误的字符串(匹配正则表达式)。

根据您使用的语言,检测匹配与否的方法可能会略有不同,但捕获组和反向引用的总体概念应该相同。

【讨论】:

    【解决方案3】:

    如果您的正则表达式允许否定,只需否定 (.)\1 的匹配项

    给定:

    $ echo "$e"
    12345 => true
    11145 => false
    aaa664 => false
    

    现在使用 perl,仅在与 (.)\1 不匹配时打印:

    $ echo "$e" | perl -lne 'print if !/(.)\1/'
    12345 => true
    

    (或$ echo "$e" | perl -lne 'print unless /(.)\1/'

    与 sed 相同:

    $ echo "$e" | sed -n '/\(.\)\1/!p'
    12345 => true
    

    grep:

    $ echo "$e" | grep -v '\(.\)\1'
    12345 => true
    

    如果你不否定匹配,那些确实有重复字母的行打印:

    $ echo "$e" | grep  '\(.\)\1'
    11145 => false
    aaa664 => false
    

    【讨论】:

      【解决方案4】:
          if (preg_match('/(.)\\1{2}/', $value)) {
          return 'NOT OK';   //invalid
          } else {
          return 'OK';  //valid
          }
      

      这就是答案!

      【讨论】:

      • 您的答案将检测到任何连续重复 3 次但不是连续重复两次的字符 - 您确定这是您想要的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2021-04-13
      • 2012-07-09
      • 1970-01-01
      • 2016-08-22
      相关资源
      最近更新 更多