处理小数点的正则表达式(如果存在)

时间:2018-09-19 02:14:30

标签: php regex

我正在使用php正则表达式来尝试解决mysql中的高级文本搜索查询。该查询需要对较小的事物进行分组以使其正常工作。目前,我可以处理“ foo 7S”之类的东西,并在看到“ foo”一词时将它们组合在一起。

当前,我的正则表达式看起来像这样

/(foo|bar|baz faz)\s+([a-zA-Z0-9]+)\b/i

但是,如果我要搜索“ foo 7.10”之类的特定内容,则“ .10”会被拆分而不是合并在一起。我当前的正则表达式是

/(foo|bar|baz faz)\s+([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)\b/i

这适用于“ foo 7.10”,但与“ foo 7”或“ foo 7S”不匹配。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您只需要使捕获小数部分的组为可选:

(foo|bar|baz faz)\s+([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)?\b
                                                  ^

https://regex101.com/r/QBFeuP/1

请注意,由于您使用的是i标志,因此正则表达式不区分大小写,因此无需使用a-zA-z-可以将其减少为a-z:< / p>

(foo|bar|baz faz)\s+([a-z0-9]+)(\.[a-z0-9]+)?\b

,如果没有下划线的可能性,可以改用\w

(foo|bar|baz faz)\s+(\w+)(\.\w+)?\b

在这种情况下,最后一个\b是不必要的,因为两个\w+都是 greedy ,并且将匹配尽可能多的字符,这意味着位置必须是单词边界。

如果有帮助的话,您也可以考虑在单词开始处放置一个边界:

\b(foo|bar|baz faz)\s+(\w+)(\.\w+)?