Pergunta

Tenho visto muitos pontos em comum nos recursos de regex de diferentes ferramentas/linguagens habilitadas para regex (por exemplo,perl, sed, java, vim, etc), mas também tenho muitas diferenças.

Tem alguma padrão subconjunto de recursos de regex que todas as ferramentas/linguagens habilitadas para regex suportarão?Como os recursos de regex variam entre ferramentas/linguagens?

Foi útil?

Solução

Compare sabores de expressão regular

http://www.regular-expressions.info/refflavors.html

Outras dicas

A maioria das ferramentas/linguagens de expressão regular suportam estes capacidades básicas:

  1. Classes/conjuntos de personagens e sua negação - []
  2. Âncoras - ^$
  3. Alternação - |
  4. Quantificadores - ?+*{n,m}
  5. Metacaracteres - \w, \s, \d, ...
  6. Referências anteriores - \1, \2, ...
  7. Ponto - .
  8. Modificadores simples como /g e /i para maiúsculas e minúsculas globais e ignoradas
  9. Personagens escapando

Suporte a ferramentas/idiomas mais avançados:

  1. Olhar para frente e para trás
  2. Classes de caracteres POSIX
  3. Limites de palavras
  4. Switches Inline gostam de permitir insensibilidade a maiúsculas e minúsculas para apenas uma pequena seção do regex
  5. Modificadores como /x para permitir formatação e comentários extras, /m para multilinhas
  6. Capturas nomeadas
  7. Unicode

Se você pegou a gramática grep regexp, não a egrep, ou a gramática sed regexp e usou isso, você deveria estar usando um subconjunto seguro em muitas plataformas e ferramentas.

Praticamente a única coisa que pode incomodá-lo é quando você alterna entre implementações de regexp usando Autômatos de Estado Finito (FSA) e aquelas que usam retrocesso, por exemplo.as implementações do quantificador variam de grep para Perl.

As implementações baseadas em FSA encontrarão a correspondência mais longa começando na primeira posição possível.Aqueles que recuam encontrarão a primeira correspondência com tendência para a esquerda, começando na primeira posição possível.Ou seja, ele tentará cada ramificação na ordem do padrão até encontrar uma correspondência.

Considere a corda "xyxyxyzz", e o padrão "(xy)*(xyz)?".Os mecanismos baseados em FSA corresponderão à substring mais longa possível, "xyxyxyz".Mecanismos baseados em retrocesso corresponderão à primeira substring polarizada para a esquerda, "xyxyxy".

Não existe um motor padrão.No entanto, o formato POSIX Extended Regular Expression é um subconjunto válido da maioria dos mecanismos e provavelmente é o mais próximo possível de um subconjunto padronizado.

Veja a sintaxe da expressão regular do emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.

Lembro-me de ter lido que a sintaxe do emacs é imutável (por motivos de compatibilidade com versões anteriores), então se você quiser ser compatível com tudo, torne tudo compatível com isso.Algumas ferramentas podem oferecer suporte, outras não.

Embora você tenha um objetivo digno, acho que será extremamente difícil alcançá-lo, e também achei difícil trabalhar com os regexps do emacs.Talvez 99% de tudo seja bom o suficiente se te deixar mais feliz e produtivo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top