Können Sie mit diesem regulären Ausdruck in meinem sourceslist.nanorc helfen?

Regex:

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

Fehler:

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

Vielen Dank.

Kommentare

  • Vielleicht sollten Sie dem Bindestrich entkommen (-): Dies kann als Bereich interpretiert werden …

Antwort

Das Problem ist wahrscheinlich die Platzierung des - -Zeichens in Ihrer Zeichenliste.

Sie haben bereits die Tatsache verwendet, dass Zeichenbereiche durch [start-end] ausgedrückt werden können, wie in [a-z] als Abkürzung für [abcdefghijkl...xyz] (siehe jedoch die Einschränkung unten). Dies bedeutet, dass das - ein Sonderzeichen ist und wenn es zwischen zwei " regulären " Zeichen, es wird so interpretiert, dass es einen weiteren Bereich angibt, der diese beiden Zeichen und jedes dazwischen umfasst.

Dies funktioniert natürlich nur, wenn das Zeichen nach - ist lexikographisch " später " in der Sortierreihenfolge und dann das Zeichen davor, was auch der Grund für Ihre Fehlermeldung ist (Sie wird sehen, dass es verschwindet, wenn Sie stattdessen (-_ sagen, obwohl das Ihr Problem nicht lösen wird ).

Da Sie offensichtlich wollen Um mit dem Literal - und übereinzustimmen, müssen Sie entweder je nachdem, wie reguläre Ausdrücke in .nanorc interpretiert werden / p>

  • muss entkommen (dh \-) oder
  • muss es zuerst oder zuletzt im Zeichen platzieren Liste (d.h. [-etc] oder [etc-]), die in regulären POSIX- und GNU-Ausdrücken Standard wären und daher Die wahrscheinlichste Lösung auf einem Linux-System .

Siehe z hier als weitere Referenz.

Vorsichtsmaßnahme : Die Anweisung über " [a-z] als Abkürzung für [abcdefghijkl...xyz] lautet nicht unbedingt wahr ! Wie der Bereich interpretiert wird, hängt von den Gebietsschemaeinstellungen ab, insbesondere von der Sortierreihenfolge.

  • Im " C " Gebietsschema, die Reihenfolge entspricht dem ASCII-Codewert, dh ABC...XYZ...abc...xyz. Hier bedeutet [a-z] tatsächlich " alle Kleinbuchstaben ".
  • In den meisten anderen Ländereinstellungen werden Groß- und Kleinbuchstaben zusammengefasst, dh die Reihenfolge lautet aAbBcC...xXyYzZ. Hier würde [a-z] " alle Kleinbuchstaben und alle Großbuchstaben außer Z bedeuten.
  • Die Behandlung von Nicht-ASCII-Zeichen wie " Umlaute " ist ein weiteres Problem.

Weitere Diskussionen zu diesem Thema finden Sie unter hier und hier .

Antwort

Einfügen unter https://regexr.com/ hilft beim Debuggen besser.

Sie haben - im Bereich nicht als - entkommen wird verwendet, um den Bereich anzugeben.

Alt:

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

Korrektur:

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

Kommentare

  • Vielen Dank für den Link
  • Es würde nicht helfen, einen Bindestrich in Klammern zu entfernen. Beachten Sie, dass Backslashes für den Ausdruck in [...] keine besondere Bedeutung haben. Dies bedeutet auch, dass [\.] einem Punkt oder einem Backslash entspricht.
  • Wirklich? Ich bezweifle. Um den Schrägstrich abzugleichen, müssen Sie ihn zweimal maskieren \\, um ihn abzugleichen.
  • @JamesJohn Versuchen Sie z. grep '[\]' <<<'\' oder grep -o '[\.]' <<<'123\.abc'
  • Fügen Sie das Problem in grep ein und sehen Sie den Fehler. Wenden Sie dann meinen Fix an, um ihn zu beheben

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.