我想有一個正則表達式來做這件事。正則表達式:不允許連續出現超過2個字符
- 串= 12345 =>真
- 串= 11145 =>假的,因爲我們不允許任何字符連續出現,這個例子是1
- 串= aaa664 =>假的,它是因爲。
我需要正則表達式來處理字符和數字,請大家幫忙。
我想有一個正則表達式來做這件事。正則表達式:不允許連續出現超過2個字符
我需要正則表達式來處理字符和數字,請大家幫忙。
if (preg_match('/(.)\\1{2}/', $value)) {
return 'NOT OK'; //invalid
} else {
return 'OK'; //valid
}
這裏就是答案!
你的答案會檢測任何連續重複3次的字符,但不會連續兩次 - 你確定這是你想要的嗎? – nhahtdh
是的,對我來說沒問題 – user2617403
嗨,我只能檢測111aa,這是在字符串的前面,在字符串的中間怎麼樣,即aa111? – user2617403
@ user2617403它會在各個層次上檢測到。請參閱演示。 – vks
您可以一般使用捕獲組和反向引用來檢測連續的字符。例如,在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
一個壞的(即正則表達式匹配)。
根據您使用的語言,檢測匹配與否的方法可能會略有變化,但捕捉組和反向引用的整體概念應該相同。
如果您正則表達式允許否定,只是否定的(.)\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
你也可以在這個找到答案 - http:// stackoverflow。COM /問題/ 12870489 /正則表達式,以匹配一個單詞 - 與唯一,非重複字符? – murtazat
@ murtazat這不一樣。只要不連續,您可以重複字符。 –