正则表达式:不允许字符连续出现2次以上

时间:2015-05-04 04:49:41

标签: regex

我想要一个正则表达式表达式。

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

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

4 个答案:

答案 0 :(得分:2)

^(?!.*(.)\1+).*$

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

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

答案 1 :(得分:0)

您通常可以使用捕获组和反向引用来检测连续的字符。例如,在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(与正则表达式匹配)。

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

答案 2 :(得分:0)

如果你的正则表达式允许否定,只需否定(.)\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

如果你没有否定匹配,那么带有print的重复字母的行:

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

答案 3 :(得分:0)

    if (preg_match('/(.)\\1{2}/', $value)) {
    return 'NOT OK';   //invalid
    } else {
    return 'OK';  //valid
    }

这是答案!