2016-03-03 40 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次