Am frühen Morgen, der zehnten Tasse Kaffee, versuchen erfolglos zu verstehen, warum die Java-Anwendung Ihres Clients (oder noch schlimmer des Servers) tödlich hängt, während Sie einen einfachen regulären Ausdruck in einer kleinen Zeile berechnen ... Wenn eine ähnliche Situation bereits in Ihrem Leben aufgetreten ist Sie kennen wahrscheinlich bereits Backtracking und Dark, abgesehen von regulären Ausdrücken. Der Rest - willkommen unter dem Schnitt!
Backtracking oder ewige Erwartung des Ergebnisses
(, , ), . – "evil regexes" ( ):
@Test
public void testRegexJDK8Only() {
final Pattern pattern = Pattern.compile("(0*)*1");
Assert.assertFalse(pattern.matcher("0000000000000000000000000000000000000000").matches());
}
: * (" ") . , ?, +, {n} (n – ).
JDK8 ( – ), JVM matches(). , .
? Pattern/Matcher java.util.regex
:
* - , . , (0) , , , . .
(backtrack) . ; . (0) , , . .
(0) . (0)! , , .
" ! ?" - . : , . , - , , 10 , . , :
@Test
public void testRegexAnyJDK() {
final Pattern pattern = Pattern.compile("([A-Za-z,.!?]+( |\\-|\\')?){1,10}");
Assert.assertFalse(pattern.matcher("scUojcUOWpBImlSBLxoCTfWxGPvaNhczGpvxsiqagxdHPNTTeqkoOeL3FlxKROMrMzJDf7rvgvSc72kQ").matches());
}
80 . JVM JDK8+ – 30 – , . - ReDoS-. , , , – "+" "{1,10}" – .
Java SDK?
, . , , . , . : JDK-5026912, JDK-7006761, JDK-8139263. StackOverflowError, (JDK-5050507). : " ", " ", " ".
"" , . (, - ), API java.util.regex
JDK ( JDK-8234713, JDK-8054028, JDK-7178072). ; , " , , " ().
. , JDK9 : , , , , . , , (JDK-6328855, ). testRegexJDK8Only()
jdk9-b119, JDK. , .
:
, , , ; , "" . , , npmjs.com. , , , , , . – , .
, , . , , . RE2, DFA - . ; – RE2 Rust, Google. JDK7+ RE2/J, C++ - .
2021 JEP-, , RE2.
RE2/J - ?
, RE2/J – . ?
, , : RE2/J – ; . , .