2015-05-04 279 views
0

我想有一個正則表達式來做這件事。正則表達式:不允許連續出現超過2個字符

  • 串= 12345 =>真
  • 串= 11145 =>假的,因爲我們不允許任何字符連續出現,這個例子是1
  • 串= aaa664 =>假的,它是因爲。

我需要正則表達式來處理字符和數字,請大家幫忙。

+0

你也可以在這個找到答案 - http:// stackoverflow。COM /問題/ 12870489 /正則表達式,以匹配一個單詞 - 與唯一,非重複字符? – murtazat

+1

@ murtazat這不一樣。只要不連續,您可以重複字符。 –

回答

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

這裏就是答案!

+0

你的答案會檢測任何連續重複3次的字符,但不會連續兩次 - 你確定這是你想要的嗎? – nhahtdh

+0

是的,對我來說沒問題 – user2617403

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

這應該因此它u太強勢了demo.The lookahead確保沒有.被再次重複。

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

+0

嗨,我只能檢測111aa,這是在字符串的前面,在字符串的中間怎麼樣,即aa111? – user2617403

+0

@ user2617403它會在各個層次上檢測到。請參閱演示。 – vks

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一個壞的(即正則表達式匹配)。

根據您使用的語言,檢測匹配與否的方法可能會略有變化,但捕捉組和反向引用的整體概念應該相同。

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 

如果不否定匹配,這確實有重複的字母與打印的線條:

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