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)?;?)+
答案 0 :(得分:1)
首先,您的正则表达式存在一些问题:要匹配xx.yyy而不是表达式(?:\d+)?(?:\.)?\d+
,您可以使用此(?:\d*\.)?\d+
。这只能以一种方式匹配,以避免不必要的回溯。
目前您的正则表达式还匹配price:minmax
和price: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)?;?)+
我不确定所有这些是什么?(我知道语法,我只是不知道你为什么这么用它),但那应该为你做。