【问题标题】: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.

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

【问题讨论】:

    标签: php regex string logic


    【解决方案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

    【讨论】:

    【解决方案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 不相遇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多