Regular Expressions (Regex) Daniel   Carneiro
Regular Expressions <ul><li>Padrão para buscas em textos
Primeira aparição no QED em 1966
Utilizado em vários editores e ferramentas atuais, principalmente em ambiente unix.
Possui extensões ao padrão original. Ex: Perl Compatible Reguar Extenstion (PCRE) </li></ul>
Pattern / Matcher <ul><li>Engine regex é divido em 2 partes </li><ul><li>Pattern -> compila as expressoes
Matcher -> executa as expressoes </li></ul></ul>
Literais <ul><li>Combinam extamente com o padrão.Ex:
Depende de opções como case-insensitive </li></ul>Regex Padrão def abc def ghi a J a ck is  a  boy
Caracteres especiais <ul><li>Os caracteres [ ]  ^ $ . | ? * + ( ) são metacaracteres e devem ser precedidos de ”” quando u...
Caracteres não-imprimíveis Caracter Código 	 Horizontal Tab (0x09) 
 Carriage Return (0x0d) 
 New Line (0x0a) a Bell (0x07...
Classes de caracteres <ul><li>Classes de caracteres ou conjuntos de caracteres indicam que qualquer um dos caracteres dent...
São denotados com uma lista de caracteres entre colchetes: [abc] </li><ul><li>Ex: ”gr [ae] y” – encontra ”gr a y” ou ”gr e...
Classes de caracteres (cont.) <ul><li>Ao utilizar o ”^” no início do grupo, significa negar o grupo, ou seja valem os cara...
Classes de caracteres (cont.) Classe Expressão w Word Character [A-Za-z0-9] W Non Word Character  [^A-Za-z0-9] s Whitespac...
Ponto <ul><li>O metacaracter mais utilizado em regex
Reconhece todos os caracteres com excessão de nova linha
Single-line mode altera este comportamento </li></ul>
Ancoras <ul><li>^ define o início da linha (ou da string)
$ define o final da linha (ou da string) </li><ul><li>Ex: ”^a” para encontrar strings que começam com ”a” </li></ul><li>Po...
 também é uma ancora que valida os limites das palavras </li></ul>
Alternação <ul><li>O metacaracter ”|” serve para definir alternação. Ex: ”a|b|c” significa ”a”  ou  ”b”  ou  ”c”
É o metacaracter de menor prioridade ou seja ”cao|gato” significa ”cao”  ou  ”gato”
Cuidado com a ordem das expressões: ”Get|GetValue” é valido para ”GetValue” e ”GetXXX” </li></ul>
Item opcional <ul><li>O metacaracter ”?” serve para indicar uma expressão opcional. </li><ul><li>Ex: ”colou?r” encontra ”c...
Repetição <ul><li>Os metacaracters ”*” e ”+” significam respectivamente ”zero ou mais vezes” e ”uma ou mais vezes” </li><u...
”*” é equivalente a ”{0,}” e ”+” é equivalente a ”{1,}” </li></ul>
Repetição (cont.) <ul><li>” *”, ”+” e ”{m,n}” são expressões  greedy  ou seja, tentarão encontrar o maior número de corres...
Repetição (cont.) <ul><li>Existem também os qualificadores possessivos que não executam backtrack ou seja não retrocedem n...
Próximos SlideShares
Carregando em…5
×

Regex

3.027 visualizações

Publicada em

Explanação sobre expressões regulares, apresentado na Bluesoft em Sao Paulo

Publicada em: Tecnologia, Diversão e humor
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
3.027
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
0
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • Ex: Editor de texto Serve tanto para busca como para replace Além de expressoes possue variantes: Posix, PCRE, Java, .Net Formado por sequencias e metacaracteres
  • Em java podem ser utilizados teoria dos conjuntos
  • Java -&gt; Posix Expressions
  • Dot é o mais error-prone Não é meta dentro de [ ]
  •  -&gt; ancora de tamanho zero
  • Primeiro executará ”.” até o fim e depois volta (backtrack) até ”&lt;/EM&gt;” -&gt; Demonstrar
  • Referencias podem ser utilizadas em editores para a substituicao de palavras
  • - Exemplo interessante -  -&gt; necessário para separar palavra (backtrack) - grupo de captura é sobrescrito pela última captura - (x)(y) -&gt; 21
  • Grupo atomo e qualificadores possessivos sao equivalentes Demonstrar backtrack -&gt; depois de encontrar bc, esquece o backreference e c nao valida
  • Apenas um teste, não é incluído no resultado da busca
  • Somente retorna ”q” na expressão diferente do exemplo da classe que retorna qu
  • Otimizando 1 -&gt; pode-se remover  pois ja foi encontrado no lookahea Otimizando 2 -&gt; w{0,3} é mais eficiente que w*
  • Regex

    1. 1. Regular Expressions (Regex) Daniel Carneiro
    2. 2. Regular Expressions <ul><li>Padrão para buscas em textos
    3. 3. Primeira aparição no QED em 1966
    4. 4. Utilizado em vários editores e ferramentas atuais, principalmente em ambiente unix.
    5. 5. Possui extensões ao padrão original. Ex: Perl Compatible Reguar Extenstion (PCRE) </li></ul>
    6. 6. Pattern / Matcher <ul><li>Engine regex é divido em 2 partes </li><ul><li>Pattern -> compila as expressoes
    7. 7. Matcher -> executa as expressoes </li></ul></ul>
    8. 8. Literais <ul><li>Combinam extamente com o padrão.Ex:
    9. 9. Depende de opções como case-insensitive </li></ul>Regex Padrão def abc def ghi a J a ck is a boy
    10. 10. Caracteres especiais <ul><li>Os caracteres [ ] ^ $ . | ? * + ( ) são metacaracteres e devem ser precedidos de ”” quando utilizados em buscas. </li><ul><li>Para buscar o texto ”1+1=2?” deve-se utilizar a expressão ”1+1=2?” </li></ul><li>Obs: Linguagens de programação podem necessitar de ”” extra. </li><ul><li>Para buscar ”c:windows” usa-se o pattern ”c:indows” e em Java a String ”c:windows” </li></ul></ul>
    11. 11. Caracteres não-imprimíveis Caracter Código Horizontal Tab (0x09) Carriage Return (0x0d) New Line (0x0a) a Bell (0x07) e Escape (0x1b) f Form Feed (0x0c) v Vertical Tab(0x0b) x00 Caracter (0x00) uFFFF Unicode (0xffff)
    12. 12. Classes de caracteres <ul><li>Classes de caracteres ou conjuntos de caracteres indicam que qualquer um dos caracteres dentro do grupo são válidos para a busca.
    13. 13. São denotados com uma lista de caracteres entre colchetes: [abc] </li><ul><li>Ex: ”gr [ae] y” – encontra ”gr a y” ou ”gr e y” </li></ul><li>Podem ser escritos intervalos de caracteres usando um ”-”. Ex: [0-9a-fA-FxX] busca os caracteres usados para notação hexadecimal </li></ul>
    14. 14. Classes de caracteres (cont.) <ul><li>Ao utilizar o ”^” no início do grupo, significa negar o grupo, ou seja valem os caracteres que NÃO estão no grupo. </li><ul><li>Ex: q[^u] – qualquer caracter depois de ”q”, que não seja ”u” </li></ul><li>Além desses, existem as abreviações para classes de caracteres, como abaixo: </li></ul>
    15. 15. Classes de caracteres (cont.) Classe Expressão w Word Character [A-Za-z0-9] W Non Word Character [^A-Za-z0-9] s Whitespace Character [ ] S Non Whitespace Character [ ] d Digit [0-9] D Non Digit [^0-9]
    16. 16. Ponto <ul><li>O metacaracter mais utilizado em regex
    17. 17. Reconhece todos os caracteres com excessão de nova linha
    18. 18. Single-line mode altera este comportamento </li></ul>
    19. 19. Ancoras <ul><li>^ define o início da linha (ou da string)
    20. 20. $ define o final da linha (ou da string) </li><ul><li>Ex: ”^a” para encontrar strings que começam com ”a” </li></ul><li>Pode ser utilizado o modo multi-line para capturar string de várias linhas
    21. 21.  também é uma ancora que valida os limites das palavras </li></ul>
    22. 22. Alternação <ul><li>O metacaracter ”|” serve para definir alternação. Ex: ”a|b|c” significa ”a” ou ”b” ou ”c”
    23. 23. É o metacaracter de menor prioridade ou seja ”cao|gato” significa ”cao” ou ”gato”
    24. 24. Cuidado com a ordem das expressões: ”Get|GetValue” é valido para ”GetValue” e ”GetXXX” </li></ul>
    25. 25. Item opcional <ul><li>O metacaracter ”?” serve para indicar uma expressão opcional. </li><ul><li>Ex: ”colou?r” encontra ”color” e ”colour” </li></ul><li>É um metacaracter ganancioso (greddy) ou seja possui preferencia por encontrar um positivo à um negativo. </li><ul><li>Ex: A expressão ”23(rd)?” encontra ”23rd” em ”Feb, 23rd” e não apenas 23. </li></ul></ul>
    26. 26. Repetição <ul><li>Os metacaracters ”*” e ”+” significam respectivamente ”zero ou mais vezes” e ”uma ou mais vezes” </li><ul><li>Ex.: ”ab*c” encontra ”abc”, ”abbc” e ”ac”, enquanto ”ab+c” não encontra ”ac” </li></ul><li>Existem também ”{n} e ”{m,n}” que significam ”n vezes” e ”de m até n vezes”
    27. 27. ”*” é equivalente a ”{0,}” e ”+” é equivalente a ”{1,}” </li></ul>
    28. 28. Repetição (cont.) <ul><li>” *”, ”+” e ”{m,n}” são expressões greedy ou seja, tentarão encontrar o maior número de correspondências possíveis. </li><ul><li>Ex: ”<.+>” em ”This is a <EM>empty</EM> test” encontrará ”<EM>empty</EM>” </li></ul><li>Colocar ”?” após ”*”, ”+”, ”{,}” e ”?” torna a expressão relutante ( reluctant ). </li><ul><li>Ex: ”<.+?>” na mesma expressão retorna ”<EM>” </li></ul><li>Uma alternativa é usar expressões negativas que são mais rápidas </li><ul><li>Ex: ”<[^>]+>” possui o mesmo efeito </li></ul></ul>
    29. 29. Repetição (cont.) <ul><li>Existem também os qualificadores possessivos que não executam backtrack ou seja não retrocedem na busca.
    30. 30. São representados por um ”+” no final ou seja ”?+”, ”++” e ”*+”
    31. 31. Qualificadores possessivos melhoram a performance da expressão </li></ul>
    32. 32. Agrupamentos <ul><li>O operador de agrupamento ( ) serve para agrupar expressoes para serem processadas atomicamente. </li><ul><li>Ex: ”Set(Value)?” encontra Set e SetValue </li></ul></ul>
    33. 33. Referências <ul><li>Os agruamentos simples ”( )” geram referências (Backreferences ou grupos de captura ), que são marcas onde o texto foi encontrado.
    34. 34. Podem ser usadas posteriormente para a extração desse texto </li><ul><li>Ex. ”Set( Value )” encontra SetValue e marca onde ” Value ” se encontra no texto. </li></ul><li>Obs: Referências diminuem a performance do regex e podem ser desativadas utilizando ”( ?: )” </li></ul>
    35. 35. Referências (cont.) <ul><li>Named Groups
    36. 36. Também podem ser utilizadas dentro da própria expressão </li><ul><li>Ex ”< ([A-Z][A-Z0-9]*) [^>]*>.*?</ 1 >” localiza qualquer expressão ”< x yyy>zzzz</ x >” </li></ul><li>Obs: </li><ul><li>sem  -> ”<b>xx</boo>” é valido
    37. 37. ” ([abc]+)” em ”cab” -> backreference ”cab”
    38. 38. ” ([abc])+” em ”cab” -> backrefenrece ”b” </li></ul></ul>
    39. 39. Referências (cont.) <ul><li>O operador ”(?> )” indica um grupo atômico, que é um grupo sem captura e sem backtrack. </li><ul><li>Ex: ”a(bc|b)c” encontra abc e abcc, porém ”a(?>bc|b)c” somente encontra abcc </li></ul></ul>
    40. 40. Lookaround <ul><li>Lookahead e lookbehind são conhecidas também como zero-width assertions, pois são marcas de texto como , porém não ”consomem” caracteres
    41. 41. Operadores lookaround também são atômicos </li></ul>
    42. 42. Lookahead <ul><li>Lookahead positivo: ”(?= )” </li><ul><li>Ex: ”q(?=u)” busca ”q” seguido de ”u”, retornando ”q” </li></ul><li>Lookahead negativo: ”(?! )” </li><ul><li>Ex: ”q(?!u)” busca ”q” que não é seguido por ”u”, retornando ”q” </li></ul></ul>
    43. 43. Lookbehind <ul><li>Lookbehind positivo: ”(?<= )” </li><ul><li>Ex: ”(?<=a)b” encontra b em ”cab” mas não encontra ”debt” </li></ul><li>Lookbegind negativo: ”(?<! )” </li><ul><li>Ex: ”(?<!a)b” -> resultado inverso ao anterior </li></ul></ul>
    44. 44. Lookaround (cont.) <ul><li>Ex: Como encontrar uma palavra de 6 caracteres que contenha ”cat” </li><ul><li>( ?=w{6} )w*catw*
    45. 45. Otimizando 1: ( ?=w{6} )w*catw*
    46. 46. Otimizando 2: ( ?=w{6} )w{0,3}catw* </li></ul></ul>
    47. 47. Observações <ul><li>Unicode characters necessitam de tratamento especial
    48. 48. Engines (Regex Directed / Text Directed)
    49. 49. Opções </li><ul><li>Case insensitive
    50. 50. Multi-line / Single line </li></ul></ul>
    51. 51. Exemplos <ul><li>Data (yyyy-mm-dd) </li><ul><li>^( (?:19|20)dd) [- /.] (0[1-9]|1[012]) [- /.] (0[1-9]|[12][0-9]|3[01]) $ </li></ul><li>Obter uma tag html </li><ul><li>< ([A-Z][A-Z0-9]*)  [^>]* >(.*?)</ 1 > </li></ul><li>Endereco IP </li><ul><li>( ?: d{1,3} .){3} d{1,3} 
    52. 52. (?:(?: 25[0-5] | 2[0-4][0-9] | [01]?[0-9][0-9]? ).){3}(?: 25[0-5] | 2[0-4][0-9] | [01]?[0-9][0-9]? ) </li></ul></ul>
    53. 53. Exemplos <ul><li>Remover linhas duplicadas </li><ul><li>^ (.*)( ? 1 )+ $
    54. 54. Replace com 1 </li></ul></ul>
    55. 55. Exemplos <ul><li>E-mail </li><ul><li> [A-Z0-9._%+-]+ @ [A-Z0-9.-] + . [A-Z]{2,4}  </li></ul><li>E-mail (RFC) </li><ul><li>(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|&quot;(?:[x01-x08x0bx0cx0e -x1fx21x23-x5bx5d-x7f]|x01-x09x0bx0cx0e -x7f])*&quot;)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[x01-x08x0b x0cx0e-x1fx21-x5ax53-x7f]|x01-x09x0b x0cx0e-x7f])+)]) </li></ul></ul>
    56. 56. Referência <ul><li>http://www.regular-expressions.info
    57. 57. http://en.wikipedia.org/wiki/Regular_expression </li></ul>

    ×