多个辅音的正则表达式

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 不相遇。

以上是关于多个辅音的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式的使用问题

正则表达式——字符组运算

PHP中如何匹配多个满足正则表达式的字符串

java的一个匹配多个邮箱的地址的正则表达式问题。

js正则表达式获取多个中括号[]中的内容

如何在 C++ 中对多个正则表达式使用正则表达式“分组”?