正则表达式查找每个字母不超过两个"o"的单词



我有一个字符串,我需要检查这个字符串是否至少包含两个不包含两个以上字母"O"实例的单词。我能够使用以下正则表达式模式成功地检查单个(第一个)单词的"O"要求:

^([a-np-z]*o?[a-np-z]*o?[a-np-z]*)[W]+

我将如何扩展此模式来检查后续单词,并将其应用于整个字符串的总体逻辑?

我能够用这个Regex:做到这一点

/(?:b[a-np-z]+b)|(?:b[a-np-z]*o[a-np-z]*o?[a-np-z]*b)/i

第一个括号匹配任何不包含字母"o"的单词。第二个匹配任何有一个或两个字母"o"的单词。

所以,如果你这样做:

$subject  = "Testing, o, oo, ooo. Not too many triple 'o' words, here are a few: ";
$subject .= "Rosewood, Zoonosis, Morocco...";
preg_match_all("/(?:\b[a-np-z]+\b)|(?:\b[a-np-z]*o[a-np-z]*o?[a-np-z]*\b)/i", $subject, $matches);
$count = count($matches[0]);
if ($count >= 2) {
    echo "Passed, found $count";
} else {
    echo "Not passed, found $count";
}
// output: Passed, found 13

$matches[0]的内容为:

print_r($matches[0]);
Array
(
    [0] => Testing
    [1] => o
    [2] => oo
    [3] => Not
    [4] => too
    [5] => many
    [6] => triple
    [7] => o
    [8] => words
    [9] => here
    [10] => are
    [11] => a
    [12] => few
)

Reg(Perl):

(w*ow*ow*)+

字符串:

pero que me estas contenedoor muchacho sonr tono orco petttae tooorpedo oo

结果:

Match 1:    contenedoor     18      11
Group 1:    contenedoor     18      11
Match 2:    tono        44       4
Group 1:    tono        44       4
Match 3:    orco        49       4
Group 1:    orco        49       4
Match 4:    tooorpedo       62       9
Group 1:    tooorpedo       62       9
Match 5:    oo      72       2
Group 1:    oo      72       2

所以现在你不能做你的preg_match_all(pattern , input , output)并计算输出大小,如果它大于2。http://php.net/manual/en/function.preg-match-all.php

对于带有双'o'的单个单词,它是

[^\Wo]+o[^\Wo]+o[^\Wo]+

这将排除任何外来字符和"o",匹配其他单词并停止查看"o"

对于重复实例

([^\Wo]+o[^\We]+o[^\Wo]+\W+)+

最新更新