Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

dnarj20130504

O que há de errado com Regular Expressions?

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

dnarj20130504

  1. 1. O que há de errado comexpressões regulares?TL;DR: não são exatamente regulares e são mal implementadas
  2. 2. DisclaimerO conteúdo desta apresentação é fortemente baseadonos dois artigos vinculados abaixo:http://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.htmlhttp://swtch.com/~rsc/regexp/regexp1.htmlConsidere lê-los com calma, são muito bons.
  3. 3. (a?a)+b
  4. 4. Expressão Linguagemabcd abcdabc?d abd, abcdabcd+ abcd, abcdd, abcddd, ...Expressões regulares
  5. 5. Hierarquia de Chomskypara gramáticas formaisIRRESTRITASSENSÍVEIS AO CONTEXTOLIVRES DE CONTEXTOREGULARES
  6. 6. Linguagem RegularLinguagem vazia é regular.Linguagem com uma string vazia é regular.Linguagem com string de um caractere é regular.A união de linguagens regulares é regular.A concatenação de linguagens regulares é regular.O fecho Kleene de linguagens regulares é regular.Nada mais é regular.
  7. 7. Gramática RegularS = aS = aT
  8. 8. abc?dabcd+a b c da b c d
  9. 9. abc?dabcd+a b c da b c d
  10. 10. Expressão AutômatoaPQP|QP?P+P*P QPPPaP Q
  11. 11. Expressão Autômato Arrayabc?d a, b, [1, 2], c, dabcd+ a, b, c, d, [1, -1](a?a)+b [1, 2], a, a, [1, -3], ba b c da b c da a b
  12. 12. Expressão Autômato Arrayabc?d a, b, [1, 2], c, da b c d0000: CONSUME a0001: CONSUME b0002: JUMP +1 OR +20003: CONSUME c0004: CONSUME d0005: YAY_MATCH!
  13. 13. c dNFA: Autômato FinitoNão DeterminísticoESTE CARA É O CULPADO
  14. 14. c dNFA: Autômato FinitoNão DeterminísticoESTE CARA É O CULPADO ?
  15. 15. Expressão Autômato Array(a?a)+b [1, 2], a, a, [1, -3], ba a b0000: JUMP +1 OR +20001: CONSUME a0002: CONSUME a0003: JUMP +1 OR -30004: CONSUME b0005: YAY_MATCH!
  16. 16. PCREPerl Compatible Regular Expressions
  17. 17. aBacktracking do tinhosoaaaaabaaabb b b b b b b b b b
  18. 18. Para uma entrada com ncaracteres e um autômatocom m estados:Cada estado pode se desdobrar ematé dois fluxos diferentes.O(2n)
  19. 19. Thompsons NFAEm 1968 um cara escreveu regexps corretamente(enquanto escrevia o Unix). E até hoje copiam errado.
  20. 20. a a baaaaaainputSimular todos os estadossimultaneamente
  21. 21. a a baaaaaainputInicialmente, há apenas umestado: o primeiro.
  22. 22. a a baaaaaainputAntes de cada caractere daentrada, avança-se todos osestados para os próximos querequerem consumo (osretângulos).
  23. 23. a a baaaaaainputDepois de consumir ocaractere, lembrar de avançarpara o próximo estado queconsome. Ou próximosestados, no caso.
  24. 24. a a baaaaaainputEventualmente dois estados,durante a transição, irãocolidir num único estado,eliminando assim o caráterexponencial da avaliação.
  25. 25. Para uma entrada com ncaracteres, e um autômatocom m estados:No máximo m estados são ativadospor caractere.O(m×n)
  26. 26. Prova de Conceitohttps://github.com/juanplopes/pyrex
  27. 27. Mas e a hierarquia?IRRESTRITASSENSÍVEIS AO CONTEXTOLIVRES DE CONTEXTOREGULARES
  28. 28. Linguagens não-regularesExemplosParêntesesaninhados(()()(())), (((()))), ..."Squares" DogDog, CatCat, WikiWiki, ...anbnab, aabb, aaabbb, ...
  29. 29. Linguagens não-regularesIRRESTRITASSENSÍVEIS AO CONTEXTOLIVRES DE CONTEXTOREGULARESanbn, parêntesesanbncn, "squares"
  30. 30. Em teoria, expressõesregulares não conseguemsequer reconhecerexpressões regulares.
  31. 31. Na prática...ExpressãoParêntesesaninhados(((?1)*))1"Squares" (.*)1anbn(a(?1)?b)11sintaxe do Perl para recursive capture buffers
  32. 32. Match de regexps combackreferences é umproblema NP-completo.
  33. 33. 3-SAT (NP-completo)(!x1|| x2|| x4) && (x1|| !x3|| x4) &&(x1|| !x2|| !x4) && (x2|| !x3|| !x4) &&(!x1|| x3|| !x4) && (x1|| x2|| x3) &&(!x1|| !x2|| !x3)
  34. 34. 3-SAT com Regexp^(x?)(x?)(x?)(x?).*;(!x1|| x2|| x4) (?:x1|2|4),(x1|| !x3|| x4) (?:1|x3|4),(x1|| !x2|| !x4) (?:1|x2|x4),(x2|| !x3|| !x4) (?:2|x3|x4),(!x1|| x3|| !x4) (?:x1|3|x4),(x1|| x2|| x3) (?:1|2|3),(!x1|| !x2|| !x3) (?:x1|x2|x3),$match xxxx;x,x,x,x,x,x,x,resultado: [xxxx;x,x,x,x,x,x,x,, x, x, , ]
  35. 35. Quais features comunspodem ser resolvidas deforma segura?
  36. 36. Counted repetitions?(abcd){1000,1000000}a b c da b c da b c da b c d
  37. 37. Alguma chance de rolarbackreferences?NO WAY!
  38. 38. E zero-width assertions?b, ^, $, (?<, (?=a<some state thatlooks around theinput and takes lots oftime, but well... itsstill polynomial>c
  39. 39. E (named) submatches?a(b)ca(?<name>b)ca b cpush1pop1a b cpushnamepopname
  40. 40. RE2https://code.google.com/p/re2/Russ Cox (Google, Go)
  41. 41. Em sumaMatch de expressões regulares pode ser feito emtempo polinomial, mas normalmente não é.Regexps na maior parte das linguagens não tem muitoa ver com expressões regulares stricto sensu.PCRE consegue definir qualquer gramática livre decontexto e algumas sensíveis a contexto também.Match de backreferences é NP-completo.

×