2012-10-26 27 views
2

您好我想使用正則表達式在JS識別3個相同的連續字符(可以是字母,數字以及所有非字母數字字符)如何將這些正則表達式相結合的JavaScript

這標識3名相同的連續的字母和數字:'(([0-9a-zA-Z])\ 1 \ 1)'
這標識了3個相同的連續非字母數字:'(([[0-9a-zA-Z])\ 1 \ 1) '(([0-9a-zA-Z])\ 1 \ 1)|(([^ 0-9a-zA-Z])\ 1 \ 1)'

但我做錯了事,而不是(^([0-9a-zA-Z] | [^ 0-zA-Z])返回true。(爲'88aa3BBdd99 @@'返回true)

編輯:並找到NO 3相同的字符,這似乎是錯誤/圖9a-ZA-Z])\ 1 \ 1)/ - >RegEx in JS to find No 3 Identical consecutive characters

感謝 Nohsib

回答

6

問題是反向引用在整個正則表達式中從左到右計數。所以,如果你把他們的號碼更改:

(([0-9a-zA-Z])\2\2)|(([^0-9a-zA-Z])\4\4) 

你也可以去除外層的括號:

([0-9a-zA-Z])\1\1|([^0-9a-zA-Z])\2\2 

或者你可以捕捉到一組括號的替代品一起追加一個反向引用到最後:

([0-9a-zA-Z]|[^0-9a-zA-Z])\1\1 

但因爲你的性格類匹配所有字符反正你可以有這樣的還有:

([\s\S])\1\1 

如果你激活DOTALL或SINGLELINE選項,你可以使用一個.代替:

(.)\1\1 
+0

+1 ::不能寫更好 –

+0

的java是否接受'(。)\ 1 {2}'?我只是好奇,因爲Perl不... –

+0

+1 - 很好的答案。 –

-1

它實際上簡單得多:

(.)\1\1

(.)匹配的任何字符,並且每個\1是回頭參考nce匹配第一個捕獲組匹配的確切字符串。您應該知道.實際匹配的內容,然後修改該組(在括號中)以符合您的確切需求。

+0

這就需要DOTALL選項相當於 –

相關問題