Pagi-pagi sekali, secangkir kopi kesepuluh, usaha yang gagal untuk memahami mengapa aplikasi java klien Anda (atau bahkan lebih buruk - server) mati suri saat menghitung regexp sederhana pada baris kecil ... Jika situasi serupa telah terjadi dalam hidup Anda , Anda mungkin sudah tahu tentang kemunduran dan sisi gelap ekspresi reguler. Sisanya - selamat datang di bawah potongan!
Mundur, atau harapan abadi akan hasilnya
(, , ), . â "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 â ; . , .