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.
O que há de errado com
expressões regulares?
*elas são NP-completas, só que não.

juanlopes.net/devday2013
Logs de aplicação
Contém muita informação

186.247.10.187 - - GET
/gnews/gnews_600/gnews_1374508780437_1374508780437_1470....
Logs de aplicação
Exemplo: IP de origem

186.247.10.187 - - GET
/gnews/gnews_600/gnews_1374508780437_1374508780437_1470.ts...
Logs de aplicação
Exemplo: identificador do vídeo

186.247.10.187 - - GET
/gnews/gnews_600/gnews_1374508780437_13745087804...
Logs de aplicação
Exemplo: URL da página em que o vídeo foi reproduzido

186.247.10.187 - - GET
/gnews/gnews_600/gnews_137...
Expressões regulares
Para extrair estas informações

(?<ip>[d.]+)s-s-sGETs(?<path>/?(?
<stream>[^/]*)/?[^.]*.?(?<extension...
Benchmarks são limitados
Essa palestra é basicamente para dizer o óbvio

sljit.sourceforge.net/regex_perf.html
Russ Cox
Um dos maiores committers da linguagem Go

“RE2, provides most of the
functionality of PCRE using a C++
interface...
PyRex
github.com/juanplopes/pyrex
Complexidade de algoritmos
Como medir a complexidade de:
(?<ip>[d.]+)s-s-sGETs(?<path>/?(?<stream>[^/]*)/?[^.]*.?(?<extens...
Repositórios online
Não estão livres de regexes maliciosas
Repositórios online
^([a-zA-Z0-9])(([-.]|[_]+)?([a-zA-Z0-9]+))*(@){1}[a-z0-9]+[.]{1}(([a-z]{2,3})|([a-z]{2,3}[.]{1}[a-z]{2...
Acontece nos melhores projetos
Mas não deveria
Regex: (a?a)+b
Regexes não deveriam se comportar assim:
Expressões regulares em
tempo linear?
Expressões regulares em
tempo linear?
SIM e NÃO?!
Expressões regulares em
tempo linear?
SIM e NÃO?!
Woody Allen Noam Chomsky
Pai da linguística moderna (e um ativista barulhento)

“A generative grammar
must be a system of ...
Hierarquia de Chomsky
Essencial para a teoria de linguagens de programação

IRRESTRITAS

SENSÍVEIS AO CONTEXTO

LIVRES DE ...
Hierarquia de Chomsky
Cada gramática exige uma máquina para reconhecê-la

Gramática

Autômato

Regras

0

Irrestrita

Máqu...
Expressões regulares
Denotam linguagens, hum…, regulares.
Forma

Descrição

ER1

∅

Linguagem vazia

ER2

ε

Linguagem con...
Autômatos finitos
Reconhecem linguagens regulares
abc?d
a

b

c

d

ε

ε

abcd*
a

b

c

d

ε
Uma notação simplificada
Para representar autômatos finitos

Autômato
a

ε

Notação
a

Instrução
CONSUME
JUMP
MATCH
Uma notação simplificada
Mesmos exemplos em nova notação
abc?d
a

b

c

d

abcd*
a

b

c

d
Conversão
Expressão regular → autômato finito
Expressão

Autômato

a

a

αβ

α

β

α|β

α

α?

α

α+
α*

α
α

β
Conversão
Útil para representar o autômato de diversas formas
ER

abc?d

abcd+

(a?a)+b

Autômato
a

a

b

b

a

c

c

a

...
NFA: Autômato Finito
Não Determinístico

c
INDETERMINISMO

d
Indeterminismo
Potencial exponencial devastador, em alguns casos
Expressão
(a?a)+b

Autômato
a

0000:
0001:
0002:
0003:
00...
Catastrophic
Backtracking
CATASTROPHIC
BACKTRACKING
PCRE

POSIX
Simular autômato
Várias formas, com vantagens e desvantagens
Método

Vantagem

Desvantagem

Backtracking

Implementação si...
Simular autômato
Paralela: melhor custo/benefício
Método

Vantagem

Desvantagem

Backtracking

Implementação simples

Simu...
PyRex
O código cabe num slide o/
Benchmarks: (a?a)+b
Caso O(2^n): exponencialmente melhor
Benchmarks: a*b
Caso O(n): pior por um fator constante
Benchmarks: a*a*a*a*a*b
Caso O(n^5): polinomialmente melhor (e Ruby rouba)
Expressões regulares em
tempo linear?
SIM e NÃO?!
Linguagens não-regulares
O que elas tem a ver com expressões regulares?

IRRESTRITAS

SENSÍVEIS AO CONTEXTO

LIVRES DE CON...
Linguagens não-regulares
Alguns exemplos

Exemplos
Parênteses
aninhados

(()()(())), (((()))), ...

"Squares"

DogDog, Cat...
Linguagens não-regulares
Alguns exemplos

IRRESTRITAS

SENSÍVEIS AO CONTEXTO

anbncn, "squares"

LIVRES DE CONTEXTO

anbn,...
Linguagens não-regulares
Expressões regulares que as reconhecem

Expressão
Parênteses
aninhados

(((?1)*))1

"Squares"

(....
Match de regexps com
backreferences é um
problema NP-completo.
P vs NP
De novo essa #&$%@?
*assumindo que P!=NP

NP-HARD

NP-COMPLETE
NP

P
Para provar NP-completude
Eu contaria uma piada sobre NP-completos, mas se você
já ouviu uma, já conhece todas.
Provar per...
3-SAT
Um problema NP-completo

(¬x1
( x1
( x1
( x2
(¬x1
( x1
(¬x1

∨
∨
∨
∨
∨
∨
∨

x2
¬x3
¬x2
¬x3
x3
x2
¬x2

∨
∨
∨
∨
∨
∨
∨
...
3-SAT
Reduzindo a expressões regulares (com backreferences)
3-SAT com Regexp
variáveis x1, x2, x3 e x4
(¬x1 ∨

^(x?)(x?)(x...
Conclusão
● Match de expressões regulares com backreferences
é um problema NP-completo.
● É possível reconhecer cadeias em...
devday2013
Upcoming SlideShare
Loading in …5
×

devday2013

1,402 views

Published on

  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

devday2013

  1. 1. O que há de errado com expressões regulares? *elas são NP-completas, só que não. juanlopes.net/devday2013
  2. 2. Logs de aplicação Contém muita informação 186.247.10.187 - - GET /gnews/gnews_600/gnews_1374508780437_1374508780437_1470.ts HTTP/1.1 "200" 346672 "-" 0.232 "AppleCoreMedia/1.0.0.10B329 (iPad; U; CPU OS 6_1_3 like Mac OS X; pt_br)" "-" - [MISS] 0.006 ms 201.51.232.169 - - GET /gnews/gnews_1000/gnews_1374508779820_1374508779820_1466.ts HTTP/1.1 "200" 552156 "http://globotv.globo.com/globo-news/globo-news-ao-vivo/v/globonewsao-vivo/61910/" 0.480 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [MISS] 0.008 ms 201.7.186.60 - - GET /ber2/ber2_400/playlist.m3u8 HTTP/1.1 "200" 538 "http: //g1.globo.com/jornal-hoje/ao-vivo.html" 0.001 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [EXPIRED] 0.001 ms
  3. 3. Logs de aplicação Exemplo: IP de origem 186.247.10.187 - - GET /gnews/gnews_600/gnews_1374508780437_1374508780437_1470.ts HTTP/1.1 "200" 346672 "-" 0.232 "AppleCoreMedia/1.0.0.10B329 (iPad; U; CPU OS 6_1_3 like Mac OS X; pt_br)" "-" - [MISS] 0.006 ms 201.51.232.169 - - GET /gnews/gnews_1000/gnews_1374508779820_1374508779820_1466.ts HTTP/1.1 "200" 552156 "http://globotv.globo.com/globo-news/globo-news-ao-vivo/v/globonewsao-vivo/61910/" 0.480 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [MISS] 0.008 ms 201.7.186.60 - - GET /ber2/ber2_400/playlist.m3u8 HTTP/1.1 "200" 538 "http: //g1.globo.com/jornal-hoje/ao-vivo.html" 0.001 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [EXPIRED] 0.001 ms
  4. 4. Logs de aplicação Exemplo: identificador do vídeo 186.247.10.187 - - GET /gnews/gnews_600/gnews_1374508780437_1374508780437_1470.ts HTTP/1.1 "200" 346672 "-" 0.232 "AppleCoreMedia/1.0.0.10B329 (iPad; U; CPU OS 6_1_3 like Mac OS X; pt_br)" "-" - [MISS] 0.006 ms 201.51.232.169 - - GET /gnews/gnews_1000/gnews_1374508779820_1374508779820_1466.ts HTTP/1.1 "200" 552156 "http://globotv.globo.com/globo-news/globo-news-ao-vivo/v/globonewsao-vivo/61910/" 0.480 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [MISS] 0.008 ms 201.7.186.60 - - GET /ber2/ber2_400/playlist.m3u8 HTTP/1.1 "200" 538 "http: //g1.globo.com/jornal-hoje/ao-vivo.html" 0.001 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [EXPIRED] 0.001 ms
  5. 5. Logs de aplicação Exemplo: URL da página em que o vídeo foi reproduzido 186.247.10.187 - - GET /gnews/gnews_600/gnews_1374508780437_1374508780437_1470.ts HTTP/1.1 "200" 346672 "-" 0.232 "AppleCoreMedia/1.0.0.10B329 (iPad; U; CPU OS 6_1_3 like Mac OS X; pt_br)" "-" - [MISS] 0.006 ms 201.51.232.169 - - GET /gnews/gnews_1000/gnews_1374508779820_1374508779820_1466.ts HTTP/1.1 "200" 552156 "http://globotv.globo.com/globo-news/globo-news-ao-vivo/v/globonewsao-vivo/61910/" 0.480 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [MISS] 0.008 ms 201.7.186.60 - - GET /ber2/ber2_400/playlist.m3u8 HTTP/1.1 "200" 538 "http: //g1.globo.com/jornal-hoje/ao-vivo.html" 0.001 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36" "-" - [EXPIRED] 0.001 ms
  6. 6. Expressões regulares Para extrair estas informações (?<ip>[d.]+)s-s-sGETs(?<path>/?(? <stream>[^/]*)/?[^.]*.?(?<extension> [^s?]*))(?<querystring>[^s]*)s[^s]*s" (?<status>d*)"s(?<body_bytes_sent>[d]*) s"(?<http_referer>[^"]*)"s[d.]+s"(? <user_agent>[^"]*)"s"(?<forwarded_for>[^"] *)"s-s[(?<cache_status>[w-]*)]s(? <upstream_response_time>[^s]*)sms.*
  7. 7. Benchmarks são limitados Essa palestra é basicamente para dizer o óbvio sljit.sourceforge.net/regex_perf.html
  8. 8. Russ Cox Um dos maiores committers da linguagem Go “RE2, provides most of the functionality of PCRE using a C++ interface very close to PCRE's, but it guarantees linear time execution and a fixed stack footprint. RE2 is now in widespread use at Google, both in Code Search and in internal systems like Sawzall and Bigtable”
  9. 9. PyRex github.com/juanplopes/pyrex
  10. 10. Complexidade de algoritmos Como medir a complexidade de: (?<ip>[d.]+)s-s-sGETs(?<path>/?(?<stream>[^/]*)/?[^.]*.?(?<extension>[^s?]*)) (?<querystring>[^s]*)s[^s]*s"(?<status>d*)"s(?<body_bytes_sent>[d]*)s"(? <http_referer>[^"]*)"s[d.]+s"(?<user_agent>[^"]*)"s"(?<forwarded_for>[^"]*)"s-s [(?<cache_status>[w-]*)]s(?<upstream_response_time>[^s]*)sms.*
  11. 11. Repositórios online Não estão livres de regexes maliciosas
  12. 12. Repositórios online ^([a-zA-Z0-9])(([-.]|[_]+)?([a-zA-Z0-9]+))*(@){1}[a-z0-9]+[.]{1}(([a-z]{2,3})|([a-z]{2,3}[.]{1}[a-z]{2,3}))$
  13. 13. Acontece nos melhores projetos Mas não deveria
  14. 14. Regex: (a?a)+b Regexes não deveriam se comportar assim:
  15. 15. Expressões regulares em tempo linear?
  16. 16. Expressões regulares em tempo linear? SIM e NÃO?!
  17. 17. Expressões regulares em tempo linear? SIM e NÃO?!
  18. 18. Woody Allen Noam Chomsky Pai da linguística moderna (e um ativista barulhento) “A generative grammar must be a system of rules that can iterate to generate an indefinitely large number of structures.”
  19. 19. Hierarquia de Chomsky Essencial para a teoria de linguagens de programação IRRESTRITAS SENSÍVEIS AO CONTEXTO LIVRES DE CONTEXTO REGULARES
  20. 20. Hierarquia de Chomsky Cada gramática exige uma máquina para reconhecê-la Gramática Autômato Regras 0 Irrestrita Máquina de Turing α→β 1 Sensível ao contexto Autômato linearmente limitado αSβ → αγβ 2 Livre de contexto Autômato de pilha S→γ Autômato finito S→ε S→a S → aT 3 Regular
  21. 21. Expressões regulares Denotam linguagens, hum…, regulares. Forma Descrição ER1 ∅ Linguagem vazia ER2 ε Linguagem contendo apenas cadeia vazia ER3 a Linguagem contendo apenas cadeia a ER4 α|β União entre Lα e Lβ ER5 αβ Concatenação entre Lα e Lβ ER6 α* Fecho Kleene sobre Lα
  22. 22. Autômatos finitos Reconhecem linguagens regulares abc?d a b c d ε ε abcd* a b c d ε
  23. 23. Uma notação simplificada Para representar autômatos finitos Autômato a ε Notação a Instrução CONSUME JUMP MATCH
  24. 24. Uma notação simplificada Mesmos exemplos em nova notação abc?d a b c d abcd* a b c d
  25. 25. Conversão Expressão regular → autômato finito Expressão Autômato a a αβ α β α|β α α? α α+ α* α α β
  26. 26. Conversão Útil para representar o autômato de diversas formas ER abc?d abcd+ (a?a)+b Autômato a a b b a c c a d d b Array Instruções 'a', 'b', [1, 2], 'c', 'd' 0000: 0001: 0002: 0003: 0004: 0005: CONSUME 'a' CONSUME 'b' JUMP (1, 2) CONSUME 'c' CONSUME 'd' MATCH! 'a', 'b', 'c', 'd', [1, -1] 0000: 0001: 0002: 0003: 0004: 0005: CONSUME a CONSUME b CONSUME c CONSUME d JUMP (1, -1) MATCH! [1, 2], 'a', 'a', [1, -3], 'b' 0000: 0001: 0002: 0003: 0004: 0005: JUMP (1, 2) CONSUME a CONSUME a JUMP (1, -3) CONSUME b MATCH!
  27. 27. NFA: Autômato Finito Não Determinístico c INDETERMINISMO d
  28. 28. Indeterminismo Potencial exponencial devastador, em alguns casos Expressão (a?a)+b Autômato a 0000: 0001: 0002: 0003: 0004: 0005: a Array b [1, 2], 'a', 'a', [1, -3], 'b' JUMP (1, 2) CONSUME 'a' CONSUME 'a' JUMP (1, -3) CONSUME 'b' MATCH!
  29. 29. Catastrophic Backtracking
  30. 30. CATASTROPHIC BACKTRACKING
  31. 31. PCRE POSIX
  32. 32. Simular autômato Várias formas, com vantagens e desvantagens Método Vantagem Desvantagem Backtracking Implementação simples Simulação exponencial Backtracking com memorização Implementação simples; complexidade polinomial Chamadas recursivas; acesso aleatório à entrada Converter para DFA Simulação linear Conversão exponencial Simulação paralela Sem chamadas recursivas; acesso sequencial à entrada Simulação superlinear Conversão preguiçosa para DFA Boa localidade de referência; melhor caso linear Pior caso ainda superlinear
  33. 33. Simular autômato Paralela: melhor custo/benefício Método Vantagem Desvantagem Backtracking Implementação simples Simulação exponencial Backtracking com memorização Implementação simples; complexidade polinomial Chamadas recursivas; acesso aleatório à entrada Converter para DFA Simulação linear Conversão exponencial Simulação paralela Sem chamadas recursivas; acesso sequencial à entrada Simulação superlinear Conversão preguiçosa para DFA Boa localidade de referência; melhor caso linear Pior caso ainda superlinear
  34. 34. PyRex O código cabe num slide o/
  35. 35. Benchmarks: (a?a)+b Caso O(2^n): exponencialmente melhor
  36. 36. Benchmarks: a*b Caso O(n): pior por um fator constante
  37. 37. Benchmarks: a*a*a*a*a*b Caso O(n^5): polinomialmente melhor (e Ruby rouba)
  38. 38. Expressões regulares em tempo linear? SIM e NÃO?!
  39. 39. Linguagens não-regulares O que elas tem a ver com expressões regulares? IRRESTRITAS SENSÍVEIS AO CONTEXTO LIVRES DE CONTEXTO REGULARES
  40. 40. Linguagens não-regulares Alguns exemplos Exemplos Parênteses aninhados (()()(())), (((()))), ... "Squares" DogDog, CatCat, WikiWiki, ... an b n ab, aabb, aaabbb, ...
  41. 41. Linguagens não-regulares Alguns exemplos IRRESTRITAS SENSÍVEIS AO CONTEXTO anbncn, "squares" LIVRES DE CONTEXTO anbn, parênteses REGULARES
  42. 42. Linguagens não-regulares Expressões regulares que as reconhecem Expressão Parênteses aninhados (((?1)*))1 "Squares" (.*)1 an b n (a(?1)?b)1 1 sintaxe do Perl para recursive capture buffers
  43. 43. Match de regexps com backreferences é um problema NP-completo.
  44. 44. P vs NP De novo essa #&$%@? *assumindo que P!=NP NP-HARD NP-COMPLETE NP P
  45. 45. Para provar NP-completude Eu contaria uma piada sobre NP-completos, mas se você já ouviu uma, já conhece todas. Provar pertinência em NP-hard NP-HARD Reduzir um problema NP-completo (3SAT, coloração de grafos, etc.) ao problema em questão. NP-COMPLETE Provar pertinência em NP NP P Provar que é possível verificar respostas positivas às instâncias do problema em tempo polinomial.
  46. 46. 3-SAT Um problema NP-completo (¬x1 ( x1 ( x1 ( x2 (¬x1 ( x1 (¬x1 ∨ ∨ ∨ ∨ ∨ ∨ ∨ x2 ¬x3 ¬x2 ¬x3 x3 x2 ¬x2 ∨ ∨ ∨ ∨ ∨ ∨ ∨ x4) x4) ¬x4) ¬x4) ¬x4) x3) ¬x3) ∧ ∧ ∧ ∧ ∧ ∧
  47. 47. 3-SAT Reduzindo a expressões regulares (com backreferences) 3-SAT com Regexp variáveis x1, x2, x3 e x4 (¬x1 ∨ ^(x?)(x?)(x?)(x?).*; 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) ∧ (¬x1 ∨ ¬x2 ∨ ¬x3) (1|2|3), (x1|x2|x3),$ match 'xxxx;x,x,x,x,x,x,x,'
  48. 48. Conclusão ● Match de expressões regulares com backreferences é um problema NP-completo. ● É possível reconhecer cadeias em linguagens regulares com algoritmo polinomial. ● Implementações como a da JDK podem levar a tempos de execução exponenciais mesmo com expressões que denotam linguagens regulares. ● O uso de expressões regulares modernas pode levar a falhas de segurança em aplicações online.

×