如何在Regex中继续比赛

时间:2010-08-05 21:13:56

标签: regex

price:(?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?

此正则表达式正确匹配以下示例。

price:1.00-342
price:.1-23
price:4
price:min-900.00
price:.10-.50
price:45-100
price:453.23-231231
price:min-max

现在我想改进它以匹配这些情况。

price:4.45-8.00;10.45-14.50
price:1.00-max;3-12;23.34-12.19
price:1.00-2.50;min-12;23.34-max

目前比赛在半结肠处停止。如何让正则表达式在分叉分隔符中重复?

最终解决方案:

price:(((\d*\.)?\d+|min)-?((\d*\.)?\d+|max)?;?)+

4 个答案:

答案 0 :(得分:1)

首先,您的正则表达式存在一些问题:要匹配xx.yyy而不是表达式(?:\d+)?(?:\.)?\d+,您可以使用此(?:\d*\.)?\d+。这只能以一种方式匹配,以避免不必要的回溯。

目前您的正则表达式还匹配price:minmaxprice:1.2.3之类的内容,我认为您不希望这些内容匹配。

重复比赛的简单方法是添加分号,然后逐字重复正则表达式。

你可以这样做,但要避免写出整个常规两次:

price:(?:(?:(?:\d*\.)?\d+|min)(?:-(?:(?:\d*\.)?\d+|max))?(?:;|$))*

Rubular上查看此操作。

答案 1 :(得分:1)

添加可选项;最后,使整个模式匹配一​​个或多个:

price:((?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?;?)+

答案 2 :(得分:1)

(?:\d+)?\d*相同,(?:\.)?可以是\.?。简化,您的原始正则表达式是:

price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?

你有两个选择。您可以执行price([:;]range)*其中 range 是匹配数字范围的正则表达式,或者更准确地说明标点符号但必须写出范围两次,做price:range(;range)*

price([:;]range)*      -- shorter but allows first ':' to be ';'
price:range(;range)*   -- longer but gets colon vs semi-colon correct

选择这两个正则表达式中的一个:

price[:;](?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?
price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?(?:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?)*

答案 3 :(得分:0)

price:((?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?;?)+

我不确定所有这些是什么?(我知道语法,我只是不知道你为什么这么用它),但那应该为你做。