Můžete mi pomoci s tímto regulárním výrazem v mém sourceslist.nanorc
?
Regex:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Chyba:
Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end
Děkuji.
Komentáře
Odpověď
Problémem pravděpodobně bude umístění znaku -
do vašeho seznamu postav.
Už jste využili skutečnost, že rozsahy znaků lze vyjádřit [start-end]
, protože [a-z]
je zkratka pro [abcdefghijkl...xyz]
(i když viz upozornění níže). To znamená, že -
je speciální znak, a pokud k němu dojde mezi dvěma " běžnými " znaků, je interpretován tak, že označuje ještě další rozsah zahrnující tyto dva znaky a všechny mezi nimi.
Samozřejmě to funguje, pouze pokud znak za -
je lexikograficky " později " v pořadí řazení než znak před ním, což je také důvod vaší chybové zprávy (vy uvidíte, že to zmizí, pokud místo toho řeknete (-_
, i když to váš problém nevyřeší ).
Protože zjevně chcete aby odpovídal doslovnému -
a podle toho, jak jsou regulární výrazy interpretovány v .nanorc
, buď
- musí tomu uniknout (tj.
\-
) nebo - umístit jej na první nebo poslední znak seznam (tj.
[-etc]
nebo[etc-]
), které by byly standardní v regulárních výrazech POSIX a GNU a proto nejpravděpodobnější řešení v systému Linux .
Viz např. zde pro další použití.
Upozornění : Výrok nad " [a-z]
je zkratkou pro [abcdefghijkl...xyz]
je není bezpodmínečně pravda ! Způsob interpretace rozsahu závisí na nastavení národního prostředí, konkrétně na pořadí řazení.
- V " C " locale, pořadí je podle hodnoty kódu ASCII, tj.
ABC...XYZ...abc...xyz
. Zde[a-z]
ve skutečnosti znamená " všechny malé znaky ". - Ve většině ostatních národních prostředí jsou velká a malá písmena seskupena dohromady, tj. Pořadí je
aAbBcC...xXyYzZ
. Zde by[a-z]
znamenalo " všechny malé znaky a všechna velká písmena kroměZ
. - Zacházení se znaky, které nejsou ASCII, jako " přehlásky " je ještě další problém.
Odpověď
Vložení tohoto na https://regexr.com/ pomáhá lépe ladit.
V rozsahu jste neunikli -
, protože -
slouží k určení rozsahu.
Starý:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Oprava:
cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/
Komentáře
- Děkujeme za odkaz
- Uniknutí pomlčky v hranatém výrazu by nepomohlo. Upozorňujeme, že zpětná lomítka nemají pro výraz uvnitř
[...]
žádný zvláštní význam. To také znamená, že[\.]
odpovídá tečce nebo zpětnému lomítku. - Opravdu? Pochybuji. Chcete-li porovnat lomítko, musíte jej dvakrát uniknout \\, aby se to shodovalo
- @JamesJohn Zkuste např.
grep '[\]' <<<'\'
nebogrep -o '[\.]' <<<'123\.abc'
- Vložte problém do grepu a podívejte se na chybu, pak ji opravte opravou
-
): toto může být interpretováno jako rozsah …