2012-02-04 26 views
3

我正在尋找一個正則表達式模式,我想在我的PHP名稱生成器腳本中使用。正則表達式爲多個輔音

它應該檢測字符串是否包含三個連續的輔音。 但是,如果連續三個輔音的兩個連續輔音相同,它就不應該檢測字符串。

例子:

"hello" -> False, because there aren't 3 consecutive consonants. 
"matching" -> True, because there are 3 consecutive consonants. 
"apple" -> False, although there are 3 consecutive consonants, because two consecutive of them are the same. 

請幫我找到了這樣的正則表達式。

回答

5

(([b-df-hj-np-tv-z])(?!\2)){3}

http://gskinner.com/RegExr/?2vtnt


編輯

這裏有一個邊緣情況下,對這種模式,如果它是由相同的最後輔音繼續失敗。 E.g xyzz應該匹配xyz但不。

這將是一個更準確的模式。 (([b-df-hj-np-tv-z])(?!\2)){2}[b-df-hj-np-tv-z]

+1

http://xkcd.com/208/ – 2012-02-04 18:31:20

+1

失敗'xyxx' – ugoren 2012-02-05 10:07:41

+0

@ugoren xyxx不包含3個連續的輔音 – 2012-02-05 10:52:52

0
/([bcdfghjklmnpqrstvwxyz]{3})/i 

這將匹配3個輔音連續。然後str_split匹配並檢查所有三項是否不同。

preg_match_all('/([bcdfghjklmnpqrstvwxyz]{3})/i', $string, $matches); 
foreach ($matches[0] as $match) { 
    $items = str_split(strtolower($match)); 
    if ($items[0] != $items[1] && $items[1] != $items[2]) { 
     // match 
    } 
} 
+1

不錯,它工作的一半。它不認爲這兩個輔音必須是連續的。例如'apgpel'匹配,但不應該因爲兩個'p'不符合。 – danijar 2012-02-04 18:25:59

+0

@sharethis謝謝你的提示。我糾正了它。 – TimWolla 2012-02-04 18:29:04

1

這將工作。

/([^aeiou]{3})/i 

^班上意味着它不應該comtain A,E,I,O,U

+0

不幸的是它也會捕獲[非字母字符](http://codepad.viper-7.com/ePCAYe)。 – nickb 2012-02-04 18:13:40

1

這可以用負的斷言和回溯來完成:
1.使用回溯建一個表達式匹配兩個相同的字符:(.)\1
2.在它之前加入.?以立即或在一個字符後面捕獲該對:.?(.)\1
3. 3個連續的輔音:[b-df-hj-np-tv-z]{3}
4.添加#2作爲否定斷言:(?!.?(.)\1)[b-df-hj-np-tv-z]{3}

我從@ zapthedingbat的回答中拿出了一些部分,這個部分更加精美,但是(我認爲)有點錯了。

+0

謝謝,但不幸的是,我不能用正則表達式來寫結果。 – danijar 2012-02-04 18:20:05

+1

看@ zapthedingbat的答案,我想出了語法並完成了我的答案。 – ugoren 2012-02-04 19:48:39