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
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 behalveZ
. - 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 '[\]' <<<'\'
, ofgrep -o '[\.]' <<<'123\.abc'
- Plak het probleem in grep en zie de fout, pas dan mijn oplossing toe om het op te lossen
-
): dit kan worden geïnterpreteerd als een bereik …