Kan du hjälpa till med denna regex i min sourceslist.nanorc
?
Regex:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Fel:
Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end
Tack.
Kommentarer
- Du kanske kanske ska undkomma strecket (
-
): detta kan tolkas som ett intervall …
Svar
Problemet är sannolikt placeringen av -
-tecknet i din karaktärslista.
Du har redan använt det faktum att teckenintervall kan uttryckas genom att [start-end]
, som i [a-z]
som förkortning för [abcdefghijkl...xyz]
(men se varningen nedan). Det betyder att -
är ett specialtecken, och om det förekommer mellan två " vanliga " tecken, det tolkas som att det anger ytterligare ett intervall som omfattar dessa två tecken och var och en däremellan.
Detta fungerar naturligtvis bara om tecknet efter -
är lexikografiskt " senare " i sorteringsordningen och sedan tecknet före det, vilket också är orsaken till ditt felmeddelande (du ser att det försvinner om du säger (-_
istället, även om det inte löser ditt problem ).
Eftersom du uppenbarligen vill för att matcha bokstavligt -
och beroende på hur reguljära uttryck tolkas i .nanorc
, antingen
- måste fly det (dvs.
\-
), eller - placera det först eller sist i tecknet lista (dvs.
[-etc]
eller[etc-]
) vilket skulle vara standard i POSIX- och GNU-reguljära uttryck den mest troliga lösningen på ett Linux-system .
Se t.ex. här för ytterligare referens.
Förbehåll : Uttrycket ovan " [a-z]
är förkortning för [abcdefghijkl...xyz]
är inte ovillkorligt sant ! Hur intervallet tolkas beror på språkinställningarna, särskilt sorteringsordningen.
- I " C " locale, ordern är enligt ASCII-kodvärde, dvs
ABC...XYZ...abc...xyz
. Här betyder[a-z]
faktiskt " alla små bokstäver ". - På de flesta andra platser grupperas stora och små bokstäver, dvs. ordningen är
aAbBcC...xXyYzZ
. Här skulle[a-z]
betyda " alla gemener och alla versaler utomZ
. - Behandlingen av icke-ASCII-tecken som " umlauts " är ännu ett problem.
Svar
Klistrar in det på https://regexr.com/ hjälper till att felsöka bättre.
Du slapp inte från -
i intervallet, eftersom -
används för att specificera intervall.
Gammalt:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Korrigering:
cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/
[...]
. Det betyder också att[\.]
matchar en punkt eller en backslash.grep '[\]' <<<'\'
, ellergrep -o '[\.]' <<<'123\.abc'