0

我有一个表情

^(((\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

现在我需要为;-separated 文本验证所有这些可能的变体

当我使用表达式时:

^(((((\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
4

5 回答 5

2

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

或者

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

于 2013-01-11T12:58:23.383 回答
1

您可以尝试:

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

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

如果要测试分隔符,只需.更改:;\.

^(\d{1,2})(\.(\d{1,2})){0,2}$
于 2013-01-11T12:55:20.783 回答
1

您的问题不是由贪婪匹配引起的,而是因为您只允许选择分隔分号。我会尝试类似的东西(鉴于dotted_number正则表达式与您的原始单值匹配,没有分号)

^(dotted_number;)*dotted_number;?$

最后,它看起来像

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

或者你可以用另一种方式对其进行perenthesize,这可能会稍微快一些

^dotted_number(;dotted_number)*;?$

即使这样也有效:

egrep '^(([[:digit:]]{1,2}\.){0,2}[[:digit:]]{1,2}(;|;?$))+$'
于 2013-01-11T13:02:09.800 回答
1

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

((\d{1,2}))

后跟 a+有效地匹配任意数量的数字。

于 2013-01-11T13:04:40.793 回答
1

也许我错了,但你需要这样的东西:

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

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

我在这里做什么?

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

99.99.99

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

\2是内括号,所以它匹配9 = ( \d )\2?

于 2013-01-11T13:07:34.203 回答