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

  • Forse dovresti evitare il trattino (-): potrebbe essere interpretato come un intervallo …

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 tranne Z.
  • Il trattamento dei caratteri non ASCII come " umlauts " è ancora un altro problema.

Vedi qui e qui per ulteriori discussioni sullargomento.

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 '[\]' <<<'\' o grep -o '[\.]' <<<'123\.abc'
  • Incolla il problema in grep e visualizza lerrore, quindi applica la mia correzione per risolverlo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *