Mamy następujące zasady naszej walidacji Nazwa użytkownika:Regex o podanie nazwy użytkownika zwiększa zużycie procesora
- Nazwa może mieć znaków alfanumerycznych
- Nazwa może mieć podkreślenia, myślnika lub okres
- Na razie zakładamy, nazwa użytkownika jest w ASCII
- Nazwa nie może zaczynać lub kończyć się kropką
- Nazwa użytkownika nie może początek, koniec lub mieć żadnych spacji
Mamy następujące regex samo:
^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$
Teraz stara się dopasować dany ciąg, użycie procesora rośnie wykładniczo. Na przykład:
[email protected]
oczywiście, pasujące ciąg jak powyżej powinien zawieść natychmiast, ale chcę wiedzieć, dlaczego jest tak dużo biorąc cykli procesora. Kod końcowa:
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());
}
}
na innej linii, przepisałem regex jak poniżej i targi dobrze:
^[\\w]+[\\w-_\\.]*[\\w]+$
Może to być spowodowane posiadaniem jednego lub więcej kwantyfikatora ('+') obejmującego całe wyrażenie, powodującego cofanie, które skutkuje dużą liczbą obserwowanych cykli procesora. – Vulcan
To brzmi jak przypadek [katastroficznego powrotu] (http://www.regular-expressions.info/catastrophic.html) ... –
@Vulcan - Dzięki za wniesienie globalnego kwantyfikatora '(+)', ale potem robi to zależy również od długości nazwy użytkownika? Tak prosty jak _username @ _ natychmiast się zawiesza. – user320599