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
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, excetoZ
. - O tratamento de caracteres não ASCII como " umlauts " é outro problema.
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 '[\]' <<<'\'
ougrep -o '[\.]' <<<'123\.abc'
- Cole o problema no grep e veja o erro e, em seguida, aplique minha correção para corrigi-lo
-
): isso pode ser interpretado como um intervalo …