我有一个表达
^(((\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
答案 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?