【问题标题】:preg_match_all not completing the string matchpreg_match_all 未完成字符串匹配
【发布时间】:2021-12-19 04:31:35
【问题描述】:

我想在大海捞针中匹配所有 needle 实例。我的针是:

/([0-9]{6,}) ([0-9]{10,}) ([0-9]{4,5}) (.{5,}) ([0-9]{1,}) ([0-9\.,]{4,8}) ([0-9\.,]{4,8})/gU

我的草垛是:

6292181 5702016627428 2304 WIDGET 18 14.12 254.16 6102211 5702015357180 10696 WIDGET 16 32.34 517.44 6332205 5702016911053 10946 WIDGET 6 32.36 194.16 

我遇到的问题是每场比赛末尾的小数位不包括在内。所以不是匹配

 6292181 5702016627428 2304 WIDGET 18 14.12 254.16 
 6102211 5702015357180 10696 WIDGET 16 32.34 517.44
 6332205 5702016911053 10946 WIDGET 6 32.36 194.16 

匹配为

 6292181 5702016627428 2304 WIDGET 18 14.12 254 
 6102211 5702015357180 10696 WIDGET 16 32.34 517
 6332205 5702016911053 10946 WIDGET 6 32.36 194 

在我看来,gU 参数有问题。

这是我的工作:https://regex101.com/r/OgKqOV/1

【问题讨论】:

    标签: preg-match-all


    【解决方案1】:

    在最后一部分添加+ 会有所帮助。它将模式从惰性转换为姿势。

    所以正则表达式变为:

    ([0-9]{6,}) ([0-9]{10,}) ([0-9]{4,5}) (.{5,}) ([0-9]{1,}) ([0-9\.,]{4,8}) ([0-9\.,]{4,8}+)
    

    工作示例(与您的相同):

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

    【讨论】:

      【解决方案2】:

      U 修饰符将所有贪婪量词转换为惰性量词,并将所有惰性量词转换为贪婪量词。如果你想让模式更短,当这个模式包含比贪婪量词更多的惰性量词时,它只是“有用的”,因为你输入的问号更少。 (IMO,它从来没有用处)。

      大多数时候人们把它当作一根魔杖,用它来解决他们所有的问题,而不是花 10 分钟来理解量词是如何工作的。

      因此,解决问题所需要做的就是删除这个无用的 U 并用问号使这个量词变得懒惰:(.{5,}?)。 所有其他量词都必须是贪婪的,因为它们以以下空格停止(不在字符类 [0-9] 中),因此您无需更改它们。

      ([0-9]{6,}) ([0-9]{10,}) ([0-9]{4,5}) (.{5,}?) ([0-9]+) ([0-9.,]{4,8}) ([0-9.,]{4,8})
      

      demo

      您可以在字符类中使用\d 而不是[0-9]0-9 来缩短您的模式。

      (\d{6,}) (\d{10,}) (\d{4,5}) (.{5,}?) (\d+) ([\d.,]{4,8}) ([\d.,]{4,8})
      

      如果您想确保匹配前后没有连续的数字,您可以在模式的开头和结尾添加单词边界:

      \b(\d{6,}) (\d{10,}) (\d{4,5}) (.{5,}?) (\d+) ([\d.,]{4,8}) ([\d.,]{4,8})\b
      

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多