【问题标题】:RegEx is matching too early正则表达式匹配得太早
【发布时间】:2016-09-08 16:59:51
【问题描述】:

有人可以帮我处理正则表达式吗? 我想删除饮料文章标题中所有不必要的信息,如大小、数量等。

我做了这个正则表达式:/(?<!^)(\d{1,2}\s?x\s?)?\d{1,2}((,|\.)\d{1,2})?\s?L?/igU

25 Test Drink 60% 12x1,0L 上,它与525 匹配。

Test Drink 60% 12x1,0L 上,它匹配60 之前的%

我怎样才能避免这些例子?我只想匹配12x1,0L。我不得不放了这么多可选字符,因为数据源在数量和大小的格式上非常不一致。也可能会出现数量缺失的情况,因为它只是一个瓶子/罐头。

我在下面和此处提供了更多示例标题:https://regex101.com/r/aQ2kO8/2

25 测试饮料 60% 12x1,0L
试饮 60% 2x0,5
试饮 3 x 0,75 L
测试饮料 4x0,75 L
测试饮料 5 x 0,75L
试饮 66 x 0,75
试饮 0,75
试饮 0.75
7UP 12 x 1 升

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你能试试(?:\d+\s*x\s*)?(?:\d+[.,])?\d+\s*L?\s*$吗?不确定我是否正确满足了您的所有要求。
  • 您正在寻找的模式是否应该始终以L 结尾?
  • @SebastianProske 感谢您的建议,但它仅与我链接中的最后一个示例匹配。我添加了?,因为这些字符只是可选的,可能不会出现在标题中。请查看我提供更多标题示例的链接
  • 如果要测试多行,请在 regex101 中使用 \m 修饰符。 regex101.com/r/iN2vD5/1
  • @MichaelWalter: regex101.com/r/pY1pP0/1

标签: php regex pcre


【解决方案1】:

您可以使用(?:\d+\s*x\s*)?(?:\d+[.,])?\d+\s*L?\s*$ 作为搜索模式,如果将其应用于多行文本,则必须设置 m 和 g 修饰符。如果您不关心 lx 的字符大小写,也可能需要 i-modifier

  • (?:\d+\s*x\s*)? 可以选择匹配后跟 x 的数字,后者可能被空格包围
  • (?:\d+[.,])? 可选匹配后跟点或逗号的数字
  • \d+ 匹配一个或多个数字
  • \s*L?\s* 可选匹配可能被空格包围的L
  • $ 匹配行尾。根据您的描述,您想要匹配的东西总是在最后,通过使用这个我们可以避免匹配饮料名称中的数字

看看regex101 demo

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2014-10-06
    • 2016-12-12
    • 2013-11-25
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多