2016-03-03 97 views
1

我有以下的正则表达式:为什么量词不起作用

^(?:[\w]+?\/)?[\w][email protected][\w]+?\.[\w]+?$ 

现在我需要用25个字来限制总字符串长度: 我试过如下:

^((?:[\w]+?\/)?[\w][email protected][\w]+?\.[\w]+?){0,25}$ 

但仍然匹配超过25个字符的正则表达式,为什么?

+0

你可以发布一些匹配或不匹配的例子吗? –

+7

匹配0到25次出现的内容() –

+1

为什么不能简单地检查字符串的长度是否小于或等于25? – gurvinder372

回答

4

量词被应用于它之前的标记。就你而言,这是一个完整的组,而且该组可以匹配比单个字符更多的内容。

单独执行长度检查,使用positive lookahead assertion

^(?=.{0,25}$)(?:\w+\/)?\[email protected]\w+\.\w+$ 

正如你所看到的,您正则表达式也可以简化颇有几分(无需懒惰量词和字符类)。

+0

谢谢,我现在明白了这个问题。我做了量词'{2}'并复制了字符串,所以它匹配了,我明白你的意思。一个问题,你为什么放弃懒惰量词? –

+0

当你真的需要贪婪的量词时,你不需要懒惰的量词。 –

+0

@WiktorStribiżew,谢谢,但我不明白为什么我需要贪婪的人在这里。你能详细说明吗? –

2

何不干脆

if (inputStr.length <= 25 && /^(?:[\w]+?\/)?[\w][email protected][\w]+?\.[\w]+?$/.test(inputStr)) 
{ 
    //your logic 
} 
+0

表现明智,'长度'检查应该首先。 –

+0

@JamesDonnelly同意,发了更改 – gurvinder372

1

如果我们称之为原正则表达式一个

^(?:[\w]+?\/)?[\w][email protected][\w]+?\.[\w]+?$ 

然后你的下一个正则表达式可以更简单地表达

^(A){0,25}$ 

所以你不只匹配25个字符,你匹配A 0到25次