2012-12-04 24 views
2

我正在嘗試構建一個應該匹配的正則表達式。正則表達式PCRE,帶有a,b的字母應該匹配沒有連續字符的字

b 
abab 
babab 

但不

bb 
babb 
aaaba 
abaaba 

目前,我有a(b)|b(a),它正在爲abab。我錯過了第一個和最後一個字母,例如bbabab

因此,我需要單獨指定a或單獨指定b,或者在單詞末尾加上一個字母(如果之前的字母本身不是這樣)。但我無法弄清楚如何做到這一點。

我正在使用http://www.rexv.org/(Perl PCRE)來嘗試它。

謝謝你們,但我忘了提: 空字符串也可以匹配, 我只能使用以下

* ? + 

| 

() 

. 

謝謝你們!

我想這是不可能無法指定字符串的開始和結束在http://www.rexv.org/處正確工作

回答

2

嘗試這樣:

^((?:(?:ab)*a?)|(?:(?:ba)*b?))$ 

解釋:

^(     # beginning of the string 
    (?: 
     (?:ab)*  # matches any repeating `ab` group 
     a?   # group can optionally end with an `a` 
    ) 
    | 
    (?: 
     (?:ba)*  # matches any repeating `ba` group 
     b?   # group can optionally end with a `b` 
    ) 
)$     # end of the string 

我包括亞組爲採用全捕獲組圍繞整個正則表達式與領先(?:非捕獲。這將確保只返回匹配的完整字符串而不是每個子組的噪聲。

對這種方法的警告是一個「空」字符串也會匹配。

UPDATE(有限的字符集)
你有限的字符集仍然會用我的方式工作上面的,但是,我們需要放棄非匹配組部分(?:)。正則表達式最終將成爲:

(((ab)*a?)|((ba)*b?)) 

上述需要注意的是,它也將匹配一個空字符串,不過,這似乎是你所需要的,所以我們可以添加到獎金列表!

允許使用的字符集的一個小問題是,您不允許使用分別指示字符串開頭和結尾的^$字符。問題在於,匹配的任何子模式(不管您使用的正則表達式)都會將輸入標記爲有效。我認爲這是佔了。

+0

它看起來像OP想要CS類正則表達式來匹配語法,所以假定錨。 – nhahtdh

0

編輯: -

如果你不想使用look-aheadlook-behind斷言,你可以使用這個表達式: -

"b?(ab)*|a?(ba)*" // Will also match `empty string` 

說明: -

b? // 0 or 1 b 
( // capture group. 
    ab // Match ab 
)* // group close `0 or more repetition 

| 

a?(ba)* // Same with `a` replaced with `b`, and `b` with `a` 

老答案: -

我們E本正則表達式: -

"((?<!a)a|(?<!b)b)*" // This will also match empty string 

它匹配a沒有被其他a之前。 b一樣。

(   // Capture group 
    (?<!  // Negative Look-behind assertion 
     a // on a 
    ) 
    a  // Match a 

    |  // or 

    (?<!  // Negative Look-behind assertion 
     b // on b 
    ) 
    b  // Match b 
)     // Close capture group 
+ // 1 or more repetition 
+0

看後面就足夠了。 – nhahtdh

+0

@nhahtdh ..是的。將編輯。謝謝:) –

0

相反構建複雜匹配正則表達式的,使用簡單的正則表達式匹配的重複字符,並使用相對爲:

String stringToMatch = "babaab"; 
    Pattern p1 = Pattern.compile("^[ab]+$");//match the a`s and b`s kind of string 
    Pattern p2 = Pattern.compile("([ab])\\1+");//match the repeating a`s and b`s 
    Matcher m1 = p1.matcher(stringToMatch); 
    Matcher m2 = p2.matcher(stringToMatch); 
    if (m1.find() && !m2.find()){//validates it has a's and b's but not repeating 
     //valid string 
    } 

要匹配任何字字符,只需使用:(\\w)\\1+。這是最好的部分。 簡單且可擴展以覆蓋更多字符集,例如abcdabcd等

+0

@Ygendage ..啊!道歉。沒有注意到他們一起工作。將工作正常。我回我的評論。 –

0

試試這個:

^((b?(ab)*a?)|(a?(ba)*b?))$ 

這裏假設你的字母被限制爲{a, b}

相關問題