@1a2b3c4d5e: Dzięki, ale mi nie chodzi o catastrophic backtracking. Chciałbym żęby silnik mielił długo, ale jednak znalazł match. Z Twoim przykładem będzie 0 matchy.
Jak na kogoś kto się zajmuje biblioteką do regexów wydaje się że mało wiesz o regexach. Catastrophic backtracking występuje jeśli jest za dużo backtrackingu, ale jeśli chcesz żeby długo mieliło to musi być dużo backtrackingu albo rekurencji (?R)
. To czy backtracking jest catastrophic czy nie zależy głównie od danych. Jeśli chcesz ograniczyć to zamiast
^(a+)+$
możesz ograniczyć do jakiejś ilości trafień grup np:
^(a+){1,6}$
24 842 steps
jeśli chcesz żeby mieliło długo a potem coś znalazło to wystarczy że dasz alternatywną grupę która da rezultat np:
^((a+){1,6}|a+=a+;)$
Albo dasz takie dane żeby regex się dużo namęczył a na końcu znalazł dopasowanie.
Przykładowo zamiast ^
i $
możesz dać inny ogranicznik, dajmy na to literkę ""b
"" i potem kopiować grupy otoczone tym znakiem żeby zmęczyć silnik a na końcu dać mu satysfakcję dając działające przypasowanie:
Regex: b((a+){1,5})b
Dane:
baaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabaaaaaaaaaaaaaaaaa=aaaabaaaaaaaa=aaaabaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
1 match (16 631 465 steps, 546ms)
Czas sobie możesz dowolnie regulować kopiując dane lub ilość alternatywnych grup w regexie (mogą być takie same bo wygląda na to że silniki regexa tego nie optymalizują i po prostu sprawdzają od zera).
Ogólnie szukaj pod hasłami "evil regex" / "ReDoS"
Możesz użyć przykładu z życia - trefnego regexa ustawionego na firewallu cloudflare który doprowadził do jego awarii w 2019:
https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/
(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*)))
To nie regex jest najważniejszy tylko dane na jakich operuje.