2014-10-16 139 views
0

我试图执行正则表达式替换。为此我定义下面的表达式:正则表达式重复

^(?:9903[0]*([0-9]*)){20}$ 

这个表达式应该匹配

99030000000000000001 
    99030000000000000011 
    99030000000000000111 
    99030000000000001111 
    99031111111111111111 

但不

9903111111111111111 

事实上,上面的表达式不工作,直到我要么使用{ 1,20}作为量词或完全删除它。但是因为我想在不知道[0] *长度和变量长度的情况下检查整个字符串的长度,我的表达式有些问题。

非常感谢您的帮助提前。

d

+0

'^(?: 66){2} $',长度必须是4不是2 – 2014-10-16 13:29:16

+1

你的例子不是很清楚,9903可以跟随任何数字吗? – 2014-10-16 13:30:34

+0

想要与'[0] * [0-9] *'匹配什么? – Toto 2014-10-16 14:00:26

回答

0

你的初始正则表达式有很多错误。

{}部分适用于整个 en 括号之间的部分。所以你现在的正则表达式需要这个部分:

(?:9903[0]*([0-9]*)) 

重复20次的全部内容,这不是你想要的。

那么这部分:

[0]*([0-9]*) 

没有什么意义,你要9903没有前导零后捕捉到多少?然后要求捕获以非零数字开始。 [0]是一个字符类,只有一个字符,相当于0

结论,我会做它像这样:

^9903(?=[0-9]{16}$)0*([1-9][0-9]*)$ 

Regex101

编辑:我后来意识到,如果它需要匹配99030000000000000000(以您的捕获组获得0),则你需要这个:

^9903(?=[0-9]{16}$)0*([0-9]+)$ 

Regex101

+0

第一个解决方案为我做了,非常感谢! – 2014-10-16 15:50:48

0

你可以做到这一点之前检查字符串的长度与lookahead

^(?=[0-9]{20}$)99030*[0-9]* 

先行(?=...)是一个零与断言检查字符串在下面。这里是检查字符串结尾前的正好20位数字。