AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 780893
Accepted
An5Drama
An5Drama
Asked: 2024-07-27 13:29:47 +0800 CST2024-07-27 13:29:47 +0800 CST 2024-07-27 13:29:47 +0800 CST

Existe uma ferramenta regex seguindo apenas BRE e gerando erros quando indefinida?

  • 772

Estou lendo Design de Software para Flexibilidade (SDF) . O Exercício 2.10 pede para implementar o tradutor tanto para BRE quanto para ERE. O livro usa greppara testar a string traduzida como (a.c)em ERE para capturar algo como abcou adc.

Eu uso Arch Linux.


Pela especificação POSIX 9.3.3 BRE Special Characters, \+não é suportado pelo BRE.

Mas man grep"Expressões Regulares Básicas vs Estendidas" permite \+a opção padrão BRE .

A diferença acima parece estar implícita neste problema de especificações (referência deste controle de qualidade ):

O BRE corresponde ao tipo ed ou grep histórico

Mas edparece também apoiar\+ .


(Editado: este parágrafo está errado, pois este site não está em conformidade com o BRE quando a opção b está habilitada. (ab)Em vez de \(ab\)corresponderá a "ab".) https://www.regexplanet.com/advanced/postgresql/index.html pode suportar o mero BRE, mas é um pouco lento e não pode ser facilmente incorporado ao código do Scheme (estou aprendendo SICP e SDF, então não verifiquei a implementação do Http no Scheme. O livro acima usa shell para executargrep ). Eu uso expressão a\+ce entrada abcpara testar com a opção b habilitada. Mostra "regex_matches()" sendo "(nenhum)".

Então existe uma ferramenta regex seguindo exatamente o BRE?

grep
  • 1 1 respostas
  • 123 Views

1 respostas

  • Voted
  1. Best Answer
    Ed Morton
    2024-07-27T20:31:06+08:002024-07-27T20:31:06+08:00

    POSIX define alguns caracteres, conhecidos como metacaracteres ou "caracteres especiais", que possuem significados não literais quando usados ​​em uma regexp, por exemplo, .corresponde a qualquer caractere. POSIX também define o que acontece quando você coloca uma barra invertida \antes de tal metacaractere, ou seja, ela se torna literal e corresponde a um caractere \.literal ..

    Caracteres que não são tais metachares, por exemplo s(ou +em um BRE), são conhecidos como "caracteres comuns". O que o POSIX diz sobre caracteres comuns é o seguinte (ênfase minha):

    9.3.2 Caracteres Comuns BRE

    Um caractere comum é um BRE que corresponde a si mesmo: qualquer caractere no conjunto de caracteres suportado, exceto os caracteres especiais BRE listados em Caracteres Especiais BRE .

    A interpretação de um caractere comum precedido por um sem escape ( '\' ) é indefinida , exceto para:

    • Os caracteres ')', '(', '{' e '}'
    • Os dígitos de 1 a 9 inclusive (consulte BREs que correspondem a vários caracteres )
    • Um caractere dentro de uma expressão entre colchetes

    ou seja, NÃO define especificamente o que acontece quando você coloca um \na frente de um caractere comum (exceto os poucos mencionados acima), e é por isso que as ferramentas podem definir \so mesmo significado [[:space:]] daquela ferramenta e ainda estar em conformidade com o padrão POSIX, já que qualquer ferramenta pode faça o que quiser com a entrada, de forma que o POSIX não defina como lidar com essa entrada.

    A respeito de:

    Existe uma ferramenta regex seguindo exatamente o BRE?

    A maioria (todas?) grepE sedas implementações o fazem por padrão, mas uma ferramenta que implementa SOMENTE os comportamentos definidos pelo POSIX, como eu acho que você espera, simplesmente não pode existir porque o POSIX deliberadamente não define tudo (o POSIX descreve a funcionalidade comum que a maioria das ferramentas tem na maioria das situações, não dita como todas as ferramentas devem se comportar em todas as situações) e, portanto, quem está implementando qualquer versão de qualquer ferramenta tem que tomar sua própria decisão sobre o que fazer quando essa ferramenta encontrar alguma entrada cujo manuseio é não definido pelo POSIX - implemente algumas funcionalidades que eles acham que serão úteis, trate-as como caracteres literais, imprima uma mensagem de aviso, apague todos os seus arquivos, corrompa seu disco rígido ou qualquer outra coisa que acharem adequada. Contanto que implementem a funcionalidade definida pelo POSIX, essa ferramenta será compatível com POSIX, independentemente do que faça nos casos indefinidos.

    Considere que existe um padrão para carros que diz “quando o motorista vira o volante para a direita, o carro vira para a direita”. Espera-se que um fabricante de automóveis cumpra esse requisito. O padrão provavelmente não define o que acontece se você puxar o volante em sua direção, então se a Nissan decidir que se você fizer isso em um Maxima 2015, o carro decolará e começará a voar ou se comprimirá em um pequeno cubo, isso ainda é compatível com o padrão. Da mesma forma, o POSIX define o que ., se \.significa, mas o POSIX não define o que \ssignifica e, portanto, o GNU pode definir \scomo equivalente [[:space:]]ou o que quiser e ainda ser compatível com POSIX.

    Portanto, se você deseja um regexp que se comporte da mesma forma em todas as versões de uma ferramenta, como grepnas formas definidas pelo POSIX, apenas não escreva um regexp que dependa de um comportamento indefinido pelo POSIX. Isso inclui não escrever \+em BRE e não escrever \sem BRE ou ERE, e tudo o que grepvocê estiver usando estará em conformidade com o padrão POSIX aplicável ao processar esse regexp.

    Regexps POSIX, BREs e EREs, são definidos no padrão POSIX , não na página de manual de qualquer ferramenta e definitivamente não em regex101.com, onde AFAIK não tem uma opção para lidar com BREs ou EREs POSIX.

    Em relação à sugestão nos comentários para definir POSIXLY_CORRECT: POSIXLY_CORRECTaplica-se apenas a ferramentas GNU, portanto não ajudaria com ferramentas BSD, etc., e o que faz varia de acordo com cada ferramenta, mesmo dentro do GNU, por exemplo, no GNU awk com POSIXLY_CORRECT defina-o reportará \scomo comportamento indefinido e o tratará apenas como um literal sem um regexp, enquanto no GNU grep tratará \s(e \+) da mesma maneira, esteja POSIXLY_CORRECT definido ou não. Por exemplo:

    $ echo 'a b' | gawk '/a\sb/'
    a b
    
    $ echo 'a b' | grep 'a\sb'
    a b
    
    $ echo 'a b' | POSIXLY_CORRECT=1 gawk '/a\sb/'
    gawk: cmd. line:1: warning: regexp escape sequence `\s' is not a known regexp operator
    
    $ echo 'a b' | POSIXLY_CORRECT=1 grep 'a\sb'
    a b
    

    $ echo 'asb' | gawk '/a\sb/'
    $
    
    $ echo 'asb' | grep 'a\sb'
    $
    
    $ echo 'asb' | POSIXLY_CORRECT=1 gawk '/a\sb/'
    gawk: cmd. line:1: warning: regexp escape sequence `\s' is not a known regexp operator
    asb
    
    $ echo 'asb' | POSIXLY_CORRECT=1 grep 'a\sb'
    $
    
    • 6

relate perguntas

  • resultados inesperados de `service | grep`

  • Leia o arquivo de texto com palavras e sua contagem de ocorrências e saída de impressão classificada

  • Comando ls | grep mostrando apenas diretórios (quando também deveria mostrar arquivos)

  • quando o grep conta e quando não

  • grep --line-buffered até X linhas?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve