多个辅音的正则表达式
Posted
技术标签:
【中文标题】多个辅音的正则表达式【英文标题】:Regex for multiple Consonants 【发布时间】:2012-02-26 22:10:43 【问题描述】:我正在寻找我想在我的 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.
请帮我找到这样的正则表达式模式。
【问题讨论】:
【参考方案1】:(([b-df-hj-np-tv-z])(?!\2))3
http://gskinner.com/RegExr/?2vtnt
编辑
这种模式有一个边缘情况,如果它以相同的最后一个辅音进行,它会失败。
例如 xyzz
应该匹配 xyz
但不匹配。
这将是一个更准确的模式。
(([b-df-hj-np-tv-z])(?!\2))2[b-df-hj-np-tv-z]
【讨论】:
@ugoren xyxx 不包含 3 个连续的辅音 好的,您将y
视为元音。 bdbb
然后。
你是对的,模式中有一个边缘情况,如果它后面跟着相同的辅音,匹配就会失败。【参考方案2】:
这可以通过否定断言和回溯来完成:
1. 使用回溯构建表达式以匹配两个相同的字符:(.)\1
。
2. 在它之前添加.?
,以立即或在字符之后捕获该对:.?(.)\1
。
3. 3个连续的辅音:[b-df-hj-np-tv-z]3
4. 在上面添加#2 作为否定断言:(?!.?(.)\1)[b-df-hj-np-tv-z]3
。
我从@zapthedingbat 的回答中提取了一些部分,这更优雅,但(我认为)有点错误。
【讨论】:
谢谢,但不幸的是,我也不太适合正则表达式来编写结果。 看了@zapthedingbat 的回答,弄明白了语法,完成了我的回答。【参考方案3】:这会起作用。
/([^aeiou]3)/i
^
在类中意味着它不应该包含 a,e,i,o,u
【讨论】:
不幸的是它也会捕获non-alphabetic characters。【参考方案4】:/([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
【讨论】:
很好,它工作到了一半。它不认为两个辅音必须是连续的。例如apgpel
匹配但它不应该因为两个p
不相遇。以上是关于多个辅音的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章