【问题标题】:regex that handles a decimal point if it exists处理小数点(如果存在)的正则表达式
【发布时间】:2018-09-19 02:14:30
【问题描述】:

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

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

/(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”不匹配。任何帮助将不胜感激。

【问题讨论】:

    标签: php regex


    【解决方案1】:

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

    (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

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

    如果没有下划线,您可以改用\w

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

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

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

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

    【讨论】:

    • 谢谢你,正是我所缺少的。我试过了?在第三次捕获之前,但显然这也不起作用。
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多