Kunt u helpen met deze regex in mijn sourceslist.nanorc?

Regex:

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

Fout:

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

Bedankt.

Opmerkingen

  • Misschien moet u aan het streepje ontsnappen (-): dit kan worden geïnterpreteerd als een bereik …

Antwoord

Het probleem is waarschijnlijk de plaatsing van het - teken in uw karakterlijst.

U heeft het feit al gebruikt dat tekenreeksen kunnen worden uitgedrukt door [start-end], zoals in [a-z] een afkorting voor [abcdefghijkl...xyz] (zie echter het voorbehoud hieronder). Dat betekent dat het - een speciaal teken is, en als het voorkomt tussen twee " reguliere " karakters, wordt het geïnterpreteerd als een aanduiding van nog een ander bereik dat deze twee karakters omvat en elk daartussenin.

Dit werkt natuurlijk alleen als het karakter na de - is lexicografisch " later " in de sorteervolgorde dan het teken ervoor, wat ook de reden is voor uw foutmelding (u zal zien dat het verdwijnt als je in plaats daarvan (-_ zegt, hoewel dat je probleem niet zal oplossen ).

Omdat je duidelijk wilt om overeen te komen met de letterlijke -, en afhankelijk van hoe reguliere expressies worden geïnterpreteerd in de .nanorc , kun je

  • moet ontsnappen (bijv. \-), of
  • plaats het als eerste of laatste in het teken lijst (d.w.z. [-etc] of [etc-]) wat standaard zou zijn in POSIX- en GNU-reguliere expressies en daarom de meest waarschijnlijke oplossing op een Linux-systeem .

Zie bijv. hier voor verdere referentie.

Waarschuwing : de bovenstaande instructie " [a-z] is een afkorting voor [abcdefghijkl...xyz] is niet onvoorwaardelijk waar ! Hoe het bereik wordt geïnterpreteerd, hangt af van de landinstellingen, met name de sorteervolgorde.

  • In de " C " locale, de volgorde is in overeenstemming met de ASCII-codewaarde, dwz ABC...XYZ...abc...xyz. Hier betekent [a-z] eigenlijk " allemaal kleine letters ".
  • In de meeste andere landinstellingen zijn hoofdletters en kleine letters bij elkaar gegroepeerd, dwz de volgorde is aAbBcC...xXyYzZ. Hier betekent [a-z] " allemaal kleine letters en alle hoofdletters behalve Z.
  • De behandeling van niet-ASCII-tekens zoals " umlauts " is nog een ander probleem.

Zie hier en hier voor verdere discussies over het onderwerp.

Antwoord

Dit plakken op https://regexr.com/ helpt om beter te debuggen.

Je bent niet ontsnapt aan - in het bereik, als - wordt gebruikt om bereik te specificeren.

Oud:

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

Correctie:

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

Reacties

  • Bedankt voor de link
  • Ontsnappen aan een streepje in een uitdrukking tussen haakjes zou niet helpen. Merk op dat backslashes geen speciale betekenis hebben voor de uitdrukking binnen [...]. Dit betekent ook dat [\.] overeenkomt met een punt of een backslash.
  • Echt? Ik twijfel. Om een schuine streep te matchen, moet je er twee keer aan ontsnappen \\ om hem te matchen
  • @JamesJohn Probeer bijv. grep '[\]' <<<'\', of grep -o '[\.]' <<<'123\.abc'
  • Plak het probleem in grep en zie de fout, pas dan mijn oplossing toe om het op te lossen

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *