我正在寻找一个我想在我的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.
请帮我找到这样的正则表达式。
答案 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
}
}