Puoi aiutarci con questa espressione regolare nel mio sourceslist.nanorc
?
Regex:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Errore:
Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end
Grazie.
Commenti
Risposta
È probabile che il problema sia la posizione del segno -
nellelenco dei caratteri.
Hai già utilizzato il fatto che gli intervalli di caratteri possono essere espressi con [start-end]
, poiché [a-z]
è una scorciatoia per [abcdefghijkl...xyz]
(anche se vedi lavvertenza di seguito). Ciò significa che -
è un carattere speciale e se si trova tra due " regolari " caratteri, viene interpretato come lindicazione di un altro intervallo che comprende questi due caratteri e ognuno in mezzo.
Ovviamente, questo funziona solo se il carattere dopo -
è lessicograficamente " più tardi " nellordinamento quindi il carattere che lo precede, che è anche il motivo del tuo messaggio di errore (tu vedrà che scompare se dici invece (-_
, anche se questo non risolverà il tuo problema ).
Dato che ovviamente vuoi per corrispondere al letterale -
e a seconda di come le espressioni regolari vengono interpretate nel .nanorc
, puoi
- deve eseguirne lescape (ad esempio
\-
), o - metterlo per primo o per ultimo nel carattere elenco (ad es.
[-etc]
o[etc-]
) che sarebbe standard nelle espressioni regolari POSIX e GNU e quindi la soluzione più probabile su un sistema Linux .
Vedi ad es. qui per ulteriore riferimento.
Avvertenza : laffermazione precedente " [a-z]
abbreviazione di [abcdefghijkl...xyz]
è non incondizionatamente vero ! Il modo in cui viene interpretato lintervallo dipende dalle impostazioni locali, in particolare dallordine di confronto.
- In " C " locale, lordine è in base al valore del codice ASCII, ovvero
ABC...XYZ...abc...xyz
. Qui,[a-z]
in realtà significa " tutti i caratteri minuscoli ". - Nella maggior parte delle altre versioni locali, i caratteri maiuscoli e minuscoli sono raggruppati, ovvero lordine è
aAbBcC...xXyYzZ
. Qui,[a-z]
significherebbe " tutti i caratteri minuscoli e tutti i caratteri maiuscoli tranneZ
. - Il trattamento dei caratteri non ASCII come " umlauts " è ancora un altro problema.
Rispondi
Incollando questo in https://regexr.com/ aiuta a eseguire meglio il debug.
Non sei sfuggito a -
nellintervallo, poiché -
viene utilizzato per specificare lintervallo.
Precedente:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Correzione:
cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/
Commenti
- Grazie per il collegamento
- Lescape di un trattino in unespressione tra parentesi non sarebbe di aiuto. Nota che i backslash non hanno alcun significato speciale per lespressione allinterno di
[...]
. Ciò significa anche che[\.]
corrisponde a un punto o una barra rovesciata. - Davvero? Dubito. Per trovare la barra in avanti, devi eseguire lescape due volte \\ per abbinarla
- @JamesJohn Prova ad es.
grep '[\]' <<<'\'
ogrep -o '[\.]' <<<'123\.abc'
- Incolla il problema in grep e visualizza lerrore, quindi applica la mia correzione per risolverlo
-
): potrebbe essere interpretato come un intervallo …