需要从贪婪中治愈我的正则表达

时间:2013-01-11 12:50:48

标签: regex

我有一个表达

^(((\d{1,2}))|((\d{1,2}\.\d{1,2}))|((\d{1,2}\.\d{1,2}\.\d{1,2})))(;?)$

验证这样的文本行:

9
99
99.9
99.99
99.99.9
99.99.99

现在我需要为; - 分隔文本

验证所有这些可能的变体

当我使用表达式时:

^(((((\d{1,2}))|((\d{1,2}\.\d{1,2}))|((\d{1,2}\.\d{1,2}\.\d{1,2})))(;?))+?)$

它变得贪婪并且允许超过2位数。

对不起,伙计们,我需要补充一些解释。这是所有可能匹配的示例

9;99;99.9;99.99;99.99.9;99.99.99

5 个答案:

答案 0 :(得分:2)

使用此正则表达式^\d{1,2}(\.|;\d{1,2})*$

设置重复次数^\d{1,2}(\.|;\d{1,2}) {0,2} $

答案 1 :(得分:1)

您可以尝试:

^(\d{1,2})(;(\d{1,2})){0,2}$

它接受带有;分隔符的描述输入。

如果您想测试.分隔符,只需使用;更改\.

^(\d{1,2})(\.(\d{1,2})){0,2}$

答案 2 :(得分:1)

您的问题不是由贪婪的匹配造成的,而是由于您只允许分离分号。我尝试过类似的东西(给定dotted_number是正则表达式,与你原来的单个值相匹配,没有分号)

^(dotted_number;)*dotted_number;?$

最后,它看起来像

^((\d{1,2}\.){0,2}(\d{1,2});)*(\d{1,2}\.){0,2}(\d{1,2});?$

或者你可以反过来使用它,这可能会稍快一些

^dotted_number(;dotted_number)*;?$

即便如此:

egrep '^(([[:digit:]]{1,2}\.){0,2}[[:digit:]]{1,2}(;|;?$))+$'

答案 3 :(得分:1)

您有问题的正则表达式允许超过两位数,因为第一个选项

((\d{1,2}))

后跟+,最后有效匹配任意数字。

答案 4 :(得分:1)

也许我错了,但你需要这样的事情:

^((\d)\2?)(?:[.](?:\1|\2))*$

*更改为您想要的任何内容:),例如{0,2}或其他与您的模式匹配的内容。

我在这做什么?

我只是使用\2 \1 - 它是一个已在正则表达式中匹配的组:)

99.99.99

\1是外括号,因此首先匹配99 = ^( (\d)\2? )...

\2是内括号,因此匹配9 = ( \d )\2?