2011-01-19 16 views
48

Czy istnieją jakieś narzędzia, które przyjmą określone wyrażenie regularne i zwrócą najgorszy scenariusz pod względem liczby operacji wymaganych dla pewnej liczby znaków, z którymi porównywane jest wyrażenie regularne?Analiza najgorszego przypadku dla wyrażeń regularnych

Na przykład, biorąc pod uwagę (f|a)oo.*[ ]baz, ile kroków może wykonać silnik, aby dopasować 100 znaków?

Byłbym także zainteresowany, jeśli istnieje narzędzie, które może pobrać kilka próbek tekstu i pokazać średnie operacje dla każdego przebiegu.

Zdaję sobie sprawę, że będzie to bardzo zależało od zastosowanego silnika i implementacji - ale nie wiem, jak często to się dzieje. Więc jeśli jest to powszechne w wielu językach (co sprawia, że ​​moje pytanie jest zbyt niejasne), byłbym szczególnie zainteresowany Perl i Python.

+0

Doskonałe pytanie! Oczywiście będzie to zależeć od regex. Dobrze wiadomo, że czyste wyrażenia regularne (nawet jak w przykładzie "(x + x +) + y", o którym mowa poniżej) przyznają automatom automatycznym o stanie skończonym, ale te wspólne biblioteki regex faktycznie implementują te z cofaniem, w dużej mierze wspierając fantazyjne takie rzeczy jak kontekst. Narzędzie, które opisujesz, byłoby świetne w łapaniu http://en.wikipedia.org/wiki/Regular_expression_Denial_of_Service_-_ReDoS –

Odpowiedz

22

Regexbuddy's debugger pokazuje, ile kroków zajmie silnik, aby zakończyć dopasowanie lub nie na danej próbce. Więcej informacji na temat catastrophic backtracking i debugging regular expressions.

catastrophic backtracking shown in RegexBuddy

PS: To nie jest wolny, ale oferują 3-miesięczną gwarancję zwrotu pieniędzy.

+1

Grałem z tym - Jeff był fanem tego: http://www.codinghorror.com /blog/2004/07/my-buddy-regex.html. Ale myślałem trochę bardziej programowo i nastawiłem się na optymalizację - jeśli to ma sens. –

11

Pamiętaj, że zależy to od silnika . Podczas gdy teoria regex opiera się na teorii automatów prostych, większość silników nie jest ścisłymi tłumaczeniami tych teorii. Z tego powodu, na przykład, niektóre silniki generują wykładniczy czas, podczas gdy ścisłe przetwarzanie NFA nie będzie.

Powiązane problemy