1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda Expressoes Regulares

Discussão em 'Programação' iniciada por Gurzi, 23 de Maio de 2009. (Respostas: 12; Visualizações: 978)

  1. Gurzi

    Gurzi Power Member

    Boas, pretendo criar uma expressão regular que detecte palavras repetidas, mas palavras únicas ou seja, por exemplo, ’the’ e ’thethe’ não podem fazer match, porque the != thethe embora a palavra esteja contida.
    Estava a seguir o meu livro de regex e diz isto:
    Parece-me bem, mas o gajo n√£o est√° a gostar dos bounds \< \>
    Alguem me pode ajudar ?

    \<([A-Za-z]+)\>\s+\<\1\>
     
  2. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Acho que tiveste problemas de codificação a escrever aqui o post. Vê o meu quote e confirma se é o que lá está escrito, sff :P
     
  3. Gurzi

    Gurzi Power Member


    sim está certo :$
     
  4. slack_guy

    slack_guy Power Member

    Mas essa expressão regular só detecta palavras duplicadas se estiverem seguidas.

    Exemplo:
    Detectaria 'ante' em:
    Código:
    "Morbi vitae eros erat, in tempus purus. Fusce [B]ante ante[/B], placerat vel"
    mas não em
    Código:
    "Morbi [B]ante[/B] vitae eros erat, in tempus purus. Fusce [B]ante[/B], placerat vel"
     
  5. AliFromCairo

    AliFromCairo Power Member

    Exacto. Podes corrigir isso facilmente substituindo \s+ por .*?.

    No entanto, se pretendes fazer match de palavras ao invés de tags (suponho que seja por isso que utilizas os "<" e ">"), precisas de indicar que a backreference é uma palavra inteira; para tal, podes utilizar, por exemplo, \b\1\b. Desta forma, evitas o problema do "the" emparelhar com "thethe".

    Espero que ajude.
     
  6. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Não indicaste onde estás a usar as expressões regulares.
    Os \< \> funcionariam no Vim, enquanto que o \b é uma extensão do Perl (uma boa parte das linguagens de programação usam a sintaxe do Perl, ou uma semelhante).
     
  7. dos conhecimentos que tenho sobre expre3ssões regulares, são de flex e bison.. deves defenir gramaticas em flex e depois usalas no bison, com o flex obtens todos os tokens que defenires depois é usar esses tokens e restringir a ordem que eles podem a aprecer nas frases.. qualquer coisa mp
     
  8. Gurzi

    Gurzi Power Member

    estava a usar no editor de texto textmate, suponho que seja perl também.

    Não percebi porque dizem que as palavras tem que estar seguidas, já que eu pus um \s + ou seja espaco um ou mais vezes :|
     
  9. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Têm que estar seguidas, na medida em que podem ter apenas espaços pelo meio.



    E tens aqui informações sobre as expressões regulares do TextMate: http://manual.macromates.com/en/regular_expressions

    Deves ter que substituir aquele \1 por $1 (o \1 também é do Vim).
     
  10. Gurzi

    Gurzi Power Member

    RUi carlos, exacto, podem estar seguidas, é isso mesmo que quero, ou seja , numa frase, encontrar palavras repetidas, mas apenas numa frase.
     
  11. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Quer com \s*, quer com .* as palavras podem estar seguidas.
    A diferença é que se colocares \s*, vais obrigar as que as palavras estejam seguidas.

    Repara nos exemplos que o slack_guy deu. Numa deles, tens uma palavra repetida na mesma frase, que com \s* não seria detectada.
     
  12. Gurzi

    Gurzi Power Member

    boa, claro, que estupidez, :D

    Outra questão \b equivale a \< e \> ???
     
  13. AliFromCairo

    AliFromCairo Power Member

    Sim, embora aparentemente o Vim não suporte o \b. De qualquer das formas, na grande maioria dos flavours de regex só existe o \b.
     

Partilhar esta Página