多个辅音的正则表达式

时间:2012-02-04 18:06:51

标签: php regex string logic

我正在寻找一个我想在我的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.

请帮我找到这样的正则表达式。

4 个答案:

答案 0 :(得分: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 :(得分:1)

这样可行。

/([^aeiou]{3})/i
班级中的

^意味着它不应该得到a,e,i,o,u

答案 2 :(得分:1)

这可以通过否定断言和回顾来完成:
1.使用lookback构建表达式以匹配两个相同的字符:(.)\1 2.在其前面添加.?,以便立即或在角色后跟踪对:.?(.)\1 3.连续3个辅音:[b-df-hj-np-tv-z]{3}
4.将上面的#2添加为否定断言:(?!.?(.)\1)[b-df-hj-np-tv-z]{3}

我从@ zapthedingbat的答案中得到了一些部分,这个答案更加精致,但(我认为)有点错误。

答案 3 :(得分: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
    }
}