Po przeczytaniu całkiem niezłej article o optymalizacji regex w java zastanawiałem się, jakie są inne dobre wskazówki do tworzenia szybkich i wydajnych wyrażeń regularnych?Regex Performance Optimization Porady i wskazówki
Odpowiedz
pomocą dowolnego (kropka) operator oszczędnie, jeśli można zrobić to w inny sposób, zrób to, kropka będzie zawsze cię ugryźć ...
nie jestem pewien, czy jest PCRE NFA i jestem znane tylko z PCRE, ale + i * są zwykle chciwe domyślnie, będą pasować tak dużo, jak to możliwe, aby zmienić to wokół użycia +? i *? Aby dopasować to, co najmniej możliwe, pamiętaj o tych dwóch klauzulach podczas pisania wyrażeń regularnych.
Należy wiedzieć, kiedy nie używać do używania wyrażenia regularnego - czasami rozwiązanie kodowane ręcznie jest bardziej wydajne i bardziej zrozumiałe.
Przykład: załóżmy, że chcesz dopasować liczbę całkowitą, która jest równomiernie podzielna przez 3. Łatwo jest zaprojektować skończoną maszynę stanów, aby to osiągnąć, a zatem musi istnieć odpowiednie wyrażenie regularne, ale wypisanie go nie jest tak banalne - i Na pewno nie znoszę tego debugowania!
Tak ... ale w niektórych systemach numerycznych jest to banalne. :-P –
masz na myśli to: '(((0 | 3 | 6 | 9) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (2 | 5 | 8))) | (((2 | 5 | 8) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (1 | 4 | 7))) ((0 | 3 | 6 | 9) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (1 | 4 | 7))) * ((1 | 4 | 7) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (2 | 5 | 8)))) * '? (Tak, zrobiłem DFA, a następnie GNFA, a następnie wyreguję: p) –
Użyj szybkiej implementacji, gdy nie masz żadnych odsyłaczy wstecz. https://swtch.com/~rsc/regexp/regexp1.html – clemens
- Użyj grupa non-przechwytywanie
(?:pattern)
kiedy trzeba powtarzać zgrupowanie, ale nie trzeba korzystać z przechwyconego wartość, która pochodzi z tradycyjnej(capturing)
grupy. - Skorzystaj z atomic group (lub podwykonań bez powrotu), jeśli dotyczy
(?>pattern)
. - Unikaj catastrophic backtracking podobnej do zarazy, projektując wyrażenia regularne, aby zakończyć wcześniej w przypadku niezgodności.
Stworzyłem film demonstrujący te techniki. Zacząłem od niezbyt dobrze napisanego wyrażenia regularnego w artykule catastrophic backtracking(x+x+)+y
. A potem zrobiłem to 3 miliony razy szybciej po serii optymalizacji, testów porównawczych po każdej zmianie. Film jest specyficzne dla .NET, ale wiele z tych rzeczy stosuje się do większości innych regex smakach, a także:
- 1. Profesjonalne porady i wskazówki
- 2. Wskazówki i porady szkoleniowe Qt
- 3. Oswajanie bestii malloc/free - porady i wskazówki
- 4. Haskell Regex performance
- 5. Podstawowe wielowątkowość w C/C++ - wskazówki, porady, samouczek, jakiś kierunek?
- 6. Entity Framework Query Optimization
- 7. Ulubione porady i triki SQLPLUS
- 8. Wskazówki i porady dotyczące używania emacsa do tworzenia aplikacji z rubinami na szynach
- 9. Wskazówki i porady dotyczące tworzenia pięknych zaprojektowanych widoków na iPhonie/Objective-C
- 10. CALayer performance vs. UIImageView performance
- 11. Wskazówki EditText i MultiAutoCompleteTextView
- 12. DAO i zastrzyk zależności, porady?
- 13. Wieloetapowe porady dotyczące wdrażania?
- 14. Django Performance/Memory usage
- 15. Przestarzałe wskazówki dotyczące optymalizacji Java
- 16. Drzewo Huffmana i wskazówki Huffmana
- 17. Wskazówki dotyczące rozgałęzień i przewidywań
- 18. Okna i wskazówki w Delphi
- 19. NLog performance
- 20. Dictionary.Count performance
- 21. Multimethods performance
- 22. IronPython performance
- 23. Czy są jakieś wskazówki/porady dotyczące korzystania z Subsonic z Asp.Net MVC Framework?
- 24. Solver Foundation Optimization - 1D Bin Packing
- 25. Datediff performance
- 26. OracleBulkCopy Performance
- 27. Biblioteki Java Open Source Image Optimization
- 28. Porady i techniki replikacji firmy Muzak
- 29. Porady dotyczące pisania zwięzłej i eleganckiej Java
- 30. Wzorce i porady dotyczące sprawdzania logiki biznesowej
chciałbym wspomnieć [Boolean Sequence] (https://github.com/NaturalIntelligence/BooleanSequence), który obecnie obsługuje mniej symboli RE, ale są one szybkie i elastyczne oraz pełne wielu przydatnych funkcji. Możesz pisać własne szablony, aby dodać więcej funkcji lub przyspieszyć je. Przeprowadzają także automatyczną optymalizację i można zobaczyć, jak są oceniane za pomocą wykresów opartych na json lub json. –