我正在使用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”不匹配。任何帮助将不胜感激。
答案 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+)?