[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.
OD WYDAJNOŚĆ REGEXPÓW, OD WYDAJNOŚĆ REGEXPÓW, DLACZEGO JA POWINIENEM? DLACZEGO JA POWINIENEM? <input id="operation" pattern='(\d+[+-]?)+='> https://regex-performance.github.io/input.html
Ruby, mongodb, elastic search automatyczne przygotowanie tekstu do tłumaczeń DDD, software that matters, agile dzielenie się wiedzą: Rzeszów Ruby User Group ( ) Politechnika Rzeszowska rrug.pl
<br>") Pattern p = Pattern.compile("<.*>"); Matcher m = p.matcher("text <br>"); boolean b = m.matches(); var pattern = /<.*>/; var results = re.exec("text <br>");
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
•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
regexp text " => "<br/>" # so far so good /<.*>/=~"<abbr> regexp text </abbr>" => "<abbr> regexp text </abbr>" #hmmm... /<[^>]*>/=~"<abbr> regexp text </abbr>" => "<abbr>" # great! /<.*?>/=~"<abbr> regexp text </abbr>" => "<abbr>" # great!
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
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+)?)/
¡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 # <-58 spacji -> GET /wp-login.php HTTP/1.1 69 GET /show.aspx HTTP/1.1 15 klient Discourse, opisane przez Sama Saffrona
(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
i kolejne części (1-4) podziękowania dla kszubrycht http://www.rexegg.com https://www.regular-expressions.info https://regex101.com/ Russ Cox aplikacja testowa - oryginał OWASP ReDoS Loggly: 5 techniquess Loggly: regexes bad better... Katafrakt: Regular expression how do they work? TextMaster: Performance of Regular Expression