diferença entre [] e \ (\) na expressão regular básica

4

Considere:

$ echo '<H1>heading</H1>' | grep '<H\(1\|3\|2\)>.*</H>'
$ <H1>heading</H1>

e

$ echo '<H1>heading</H3>' | grep '<H[1-3]>.*</H>'
$ grep: Invalid back reference
O primeiro comando

funciona bem.

  1. Não [1-3] e \(1\|3\|2\) significam 1 ou 2 ou 3? se não porque? e qual a diferença entre eles?
  2. por que a referência de referência funciona apenas com \(\) ?
por Edward Torvalds 16.10.2015 / 14:40

2 respostas

5
  • () significa «agrupamento», o que significa definir uma parte da cadeia que pode funcionar como 1 item e também para o backrefference.
  • [] significa símbolos conjunto

Então, se você usar parênteses apenas para símbolos únicos, o significado é o mesmo. Mas geralmente é usado para strings com vários símbolos como (cat|dog)

    
por 16.10.2015 / 14:57
8

Parte 1: Sim, os dois padrões corresponderão a 1 ou 2 ou 3.

Parte da resposta à sua primeira pergunta é sua segunda pergunta. Curiosamente.

Os parênteses são usados para habilitar referências anteriores e para esclarecer a prioridade / agrupamento do operador.

Colchetes incluem uma classe de caracteres . Eles são usados para corresponder a uma instância do conjunto de caracteres dentro dele.

Por exemplo, \(hello\) corresponderia à palavra "hello" e também a colocaria na variável de referência apropriada ( , , etc.)

Por outro lado, [hello] corresponderia a um caractere SINGLE, um dos conjuntos {e, h, l, o}.

Alguns dados adicionais (apenas informações extras):

Backreferences baseiam-se na sequência do paren aberto, não no paren próximo. Com parêntesis aninhados isso pode se tornar importante. Ignorando caracteres de escape para facilitar a leitura— (this (that) (the other)) resultará em contendo this that the other ; contendo that e contendo the other .

Uma contagem em uma classe de caracteres verifica mais instâncias dessa classe de caracteres. Eles não precisam combinar da mesma maneira. Por exemplo, [0-9] corresponderá a um único dígito e [0-9]{5} corresponderá a cinco dígitos. Se você quiser combinar apenas 5 dígitos repetidos , por exemplo coincide com 77777 ou 33333 mas não com 37497, use uma referência anterior: \([0-9]\){4}

    
por 16.10.2015 / 14:57