[PL] (HackYeah) Nie ma nic prostszego niż napisanie wolnego regexpa
Slajdy z prezentacji podczas hackatonu HackYeah, Warszawa 24-25.11.2018.
W prezentacji: o tym, jak działają silniki regexpów, jak to wpływa na czas działania regexpa. Oraz o tym, co złego może się stać, jeśli nie dbamy o wydajność regexpów.
NIE MA NIC PROSTSZEGO NIŻ NIE MA NIC PROSTSZEGO NIŻ NAPISANIE WOLNEGO NAPISANIE WOLNEGO REGEXPA REGEXPA MACIEK RZĄSA MACIEK RZĄSA HackYeah, 24.11.2018 @mjrzasa
I'm definitely guilty of this. When I throw a regex together, I never worry about performance; I know the target strings will generally be far too small to ever cause a problem. Jeff Atwood, 2006
TEORIA... TEORIA... gramatyka regularna wyrażenie regularne: abab|abbb automat skończony a b a a b b b b źródło: A -> abB B -> bb B -> ab https://swtch.com/~rsc/regexp/regexp1.html
DWA RODZAJE SILNIKÓW DWA RODZAJE SILNIKÓW REGEXPÓW REGEXPÓW 1. Text-directed Thompson 1968, 400 linii w C grep, awk, sed, go oparte na DFA 2. Regex-directed Larry Wall, perl, 1987 Perl-Compatible Regular Expressions (JavaScript, Ruby, .Net,...) oparte na NFA
Regex-directed abab|abbb a b a a b b b b •abbb a b a a b b b b •abbb a b a a b b b b a•bbb a b a a b b b b ab•bb a b a a b b b b •abbb a b a a b b b b a•bbb a b a a b b b b ab•bb a b a a b b b b abb•b a b a a b b b b abbb• failure, backtracking
CO JUŻ WIEMY? CO JUŻ WIEMY? regexpy - osobny język programowania dwa rodzaje silników (maszyn wirtualnych) - text-directed, regex-directed istotna jest ilość kroków i powrotów
POWTÓRZENIA POWTÓRZENIA wydajność zależna od kontekstu zachłanne .* .+ - wydajność zależna od długości nadmiarowo znalezionego tekstu leniwe .*? .+? - wydajność zależna od długości szukanego tekstu testy pozytywne: szukany string w różnych miejscach tekstu testy negatywne: napis bardzo podobny do szukanego
CZEGO UNIKAĆ? CZEGO UNIKAĆ? zagnieżdżone powtórzenia /(\d+)*\w/ odległe, krzyżujące się powtórzenia /.*-some text-.*;/ nachodzące się zakresy /\d+\w*/ nachodzace się alternatywy /(\d+|\w+)/
KOMPUTERY TERAZ SĄ TAK KOMPUTERY TERAZ SĄ TAK SZYBKIE, ŻE NAWET 100 000 SZYBKIE, ŻE NAWET 100 000 KROKÓW NIE MA ZNACZENIA! KROKÓW NIE MA ZNACZENIA! kilka słów o zastosowaniach
ZLICZANIE LICZB W TEKŚCIE ZLICZANIE LICZB W TEKŚCIE co może być prostszego? # liczba # 1, 3243, 4323 pattern = /\d+/ # liczba z częścią dziesiętną i minusem # -1, 1, 32.32, -2.2324 pattern = /-?(\d+(\.\d+)?/ # liczba z częścią dziesiętną (kropka albo przecinek) # -23,23 4323.23 pattern = /-?(\d+([.,]\d+)?)/
JAK ZAJĄĆ 100% PROCESORA? JAK ZAJĄĆ 100% PROCESORA? Witaj! → ¡Hola! → Salut ! # Ruby # Źródła funkcji ::Typography.to_html_french # Wstaw cienką spację przed znaki interpunkcyjne text.gsub(/(\s|)+([!?;]+(\s|\z))/, ' \2\3') # Dane # GET /wp-login.php HTTP/1.1 69 GET /show.aspx HTTP/1.1 15 klient Discourse, opisane przez Sama Saffrona
WNIOSKI WNIOSKI wyrażenia regularne - teoria (języki formalne) i praktyka (języki programowania) nie zawsze idą w parze każdy silnik jest inny - sprawdzaj, jak działa Twój główne problemy: nachodzące się zakresy lub alternatywy, zagnieżdżone powtórzenia testy: poprawny, niepoprawny, prawie poprawny napis, różne konfiguracje