检测用单词表示的数字的正则表达式

10

我需要一段PHP代码来检测一个字符串中是否包含4个或更多连续的数字(0到9),例如:

"one four six nine five"

或者

"zero eight nine nine seven three six six"

这些数字可以任意大吗? - phimuemue
2
“一百四十六”是一个数字吗?两个数字?三个?四个? - Mark Byers
仅限0到9之间的单个数字。 - Sherif Omar
1
那么你示例中的十二是否无关紧要? "一四六十二" 是否匹配? - Bobby Jack
4个回答

6

您可以这样做:

\b(?:(?:zero|one|two|three|four|five|six|seven|eight|nine)(?: +|$)){4}

(Rubular)


3
另一种选择是:
\b(?:(?:one|two|three|four|five|six|seven|eight|nine|zero)\b\s*?){4}

这与其余部分基本相同。唯一有趣的部分是\s*? - 它将懒惰地匹配单词之间的空格,因此您不会在4个单词序列之后得到额外的空格。\b位于其前面,确保至少有一个空格(或其他分隔符在最后一个单词之后,因此!a b c d!将匹配)。


1
+1 我相当喜欢这种方法。这是一个 Rubular 链接:http://rubular.com/r/Fm4dGwkNGg ... 不过你忘了零。 - Mark Byers
@Mark - 谢谢。我也在那里测试了一下,只是忘记了链接。我的零个,但它没有排序 :) - Kobi
哦,是按键盘顺序排列的。我应该注意到零是Rubular链接中的一个示例之一。对不起。 :) - Mark Byers

2
/(?:(?:^|\s)(?:one|two|three|four|five|six|seven|eight|nine|ten)(?=\s|$)){4,}/

PHP 代码:

if (preg_match(...put regex here..., $stringToTestAgainst)) {
    // ...
}

注意: 可以轻松地将更多单词(如“twelve”)添加到正则表达式中。

@Sherif,是的。请注意,您需要将正则表达式放在字符串中("/.../"),并且您可能需要转义\s(=>\\s)。 - James
1
允许的数字是从零到九,但不包括十。 - Toto

0
if (preg_match("/(?:\b(?:(one)|(two)|(three)|(four)|(five)|(six)|(seven)|(eight)|(nine))\b\s*?){4,}/", $variable_to_test_against, $matches)) {
  echo "Match was found <br />";
  echo $matches[0];
}

编辑:

在正则表达式中添加了空格 - 感谢Kobi。


2
你是不是漏掉了单词之间的空格了? - Kobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接