我們爲我們的用戶名的驗證規則如下:正則表達式的用戶名增加了CPU消耗
- 用戶名可以包含字母數字字符
- 用戶名可以有下劃線,連字符或一段
- 現在假設用戶名是在ASCII
- 用戶名不能啓動或以句點結束
- 用戶名不能啓動,結束或任何空格
我們有相同的正則表達式如下:
^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$
現在試圖以匹配特定字符串,CPU使用率呈指數增長。例如:
[email protected]
顯然,匹配上面的字符串應該會立即失敗,但我想知道爲什麼需要這麼多的CPU週期。最終代碼:
import java.util.regex.*;
public class R {
static final Pattern namePattern = Pattern.compile("^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$");
public static void main(String... args) {
final String userName = "[email protected]";
Matcher matcher = namePattern.matcher(userName);
System.out.println(matcher.matches());
}
}
在不同的線路,我重寫了正則表達式如下圖所示,它交易會得好:
^[\\w]+[\\w-_\\.]*[\\w]+$
它可能是由一個或多個量詞('+')封裝整個正則表達式引起的,導致回溯導致您觀察到大量的CPU週期。 – Vulcan 2013-04-29 20:23:41
這聽起來像是[災難性的回溯](http://www.regular-expressions.info/catastrophic.html)的案例... – 2013-04-29 20:26:42
@Vulcan - 感謝您帶來全球的'(+)'量詞,還取決於用戶名的長度?就像_username @ _一樣簡單,即時失敗。 – user320599 2013-04-29 20:31:24