Você pode ajudar com este regex em meu sourceslist.nanorc?

Regex:

 cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/  

Erro:

 Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end  

Obrigado.

Comentários

  • Talvez você deva escapar do traço (-): isso pode ser interpretado como um intervalo …

Resposta

O problema provavelmente é a colocação do sinal - em sua lista de personagens.

Você já usou o fato de que intervalos de caracteres podem ser expressos por [start-end], como [a-z] sendo uma abreviação de [abcdefghijkl...xyz] (embora veja a advertência abaixo). Isso significa que - é um caractere especial e, se ocorrer entre dois " regulares " caracteres, ele é interpretado como uma indicação de outro intervalo que engloba esses dois caracteres e todos os entre eles.

Claro, isso só funciona se o caractere após - está lexicograficamente " mais tarde " na ordem de classificação do caractere que o precede, que também é o motivo de sua mensagem de erro (você verá que ele desaparece se você disser (-_ em vez disso, embora isso não resolva seu problema ).

Já que você obviamente deseja para corresponder ao literal -, e dependendo de como as expressões regulares são interpretadas no .nanorc , você

  • deve ser escapado (ou seja, \-) ou
  • colocá-lo primeiro ou último no caractere lista (ou seja, [-etc] ou [etc-]) que seria padrão em expressões regulares POSIX e GNU e, portanto a solução mais provável em um sistema Linux .

Veja, por exemplo aqui para referência futura.

Advertência : a declaração acima " [a-z] sendo uma abreviação para [abcdefghijkl...xyz] é não é incondicionalmente verdadeiro ! Como o intervalo é interpretado depende das configurações de local, especificamente a ordem de agrupamento.

  • No " C " local, a ordem está de acordo com o valor do código ASCII, ou seja, ABC...XYZ...abc...xyz. Aqui, [a-z] realmente significa " todos os caracteres minúsculos ".
  • Na maioria dos outros locais, os caracteres maiúsculos e minúsculos são agrupados, ou seja, a ordem é aAbBcC...xXyYzZ. Aqui, [a-z] significaria " todos os caracteres minúsculos e todos os caracteres maiúsculos, exceto Z.
  • O tratamento de caracteres não ASCII como " umlauts " é outro problema.

Veja aqui e aqui para mais discussões sobre o assunto.

Resposta

Colando em https://regexr.com/ ajuda a depurar melhor.

Você não escapou - no intervalo, como - é usado para especificar o intervalo.

Antigo:

cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/ 

Correção:

cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/ 

Comentários

  • Obrigado pelo link
  • Escapar um traço em uma expressão entre colchetes não ajudaria. Observe que as barras invertidas não têm nenhum significado especial para a expressão dentro de [...]. Isso também significa que [\.] corresponde a um ponto ou barra invertida.
  • Sério? Duvido. Para combinar a barra, você deve escapar duas vezes \\ para corresponder
  • @JamesJohn Tente, por exemplo grep '[\]' <<<'\' ou grep -o '[\.]' <<<'123\.abc'
  • Cole o problema no grep e veja o erro e, em seguida, aplique minha correção para corrigi-lo

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *