Ich habe eine Regex, die gut funktioniert (500 Nanosekunden), wenn eine Übereinstimmung gefunden wird, aber viel Zeit (über 3 Sekunden) dauert, wenn es keine Übereinstimmung gibt. Ich vermute, das könnte wegen Backtracking sein. Ich habe einige Optionen ausprobiert, wie die Umwandlung von .*
in (.*)?
basierend auf einer Dokumentation, aber es hat nicht geholfen.Regex Pattern Match-Leistung in Java für lange Zeichenfolge
Eingabe: eine sehr lange Zeichenfolge - 5k Zeichen in einigen Fällen.
Regex zum Spiel: .*substring1.*substring2.*
Ich bin das Muster vorge Kompilieren und Wiederverwendung der Matcher, was kann ich sonst noch versuchen?
Hier ist mein Code-Snippet - ich werde diese Methode mit Millionen von verschiedenen Eingabezeichenfolgen aufrufen, aber nur eine Handvoll Regex-Muster.
private static HashMap<String, Pattern> patternMap = new HashMap<String, Pattern>();
private static HashMap<String, Matcher> matcherMap = new HashMap<String, Matcher>();
Hier ist meine Methode:
public static Boolean regex_match(String line, String regex) {
if (regex == null || line == null) {
return null;
}
if (!patternMap.containsKey(regex)) {
patternMap.put(regex, Pattern.compile(regex));
matcherMap.put(regex,patternMap.get(regex).matcher(""));
}
return matcherMap.get(regex).reset(line).find(0);
}
Was ist Ihr Ziel hier? Müssen Sie Regex verwenden? – Pshemo
Bitte zeigen Sie Ihren Code –
@ Pshemo - ja, ich muss Regex verwenden. – user100001