Puteți ajuta cu această regex în sourceslist.nanorc
?
Regex:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Eroare:
Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end
Vă mulțumim.
Comentarii
Răspuns
Problema este probabil plasarea semnului -
în lista de caractere.
Ați folosit deja faptul că intervalele de caractere pot fi exprimate prin [start-end]
, ca în [a-z]
fiind prescurtat pentru [abcdefghijkl...xyz]
(deși vezi avertismentul de mai jos). Asta înseamnă că -
este un caracter special și, dacă apare între două " obișnuite " caractere, este interpretat ca indicând încă un alt interval care cuprinde aceste două caractere și fiecare dintre ele.
Desigur, acest lucru funcționează numai dacă caracterul de după -
este lexicografic " mai târziu " în ordinea de sortare, apoi caracterul care o precedă, care este și motivul mesajului dvs. de eroare (dvs. va vedea că dispare dacă spuneți (-_
, deși asta nu vă va rezolva problema ).
Din moment ce doriți în mod evident pentru a se potrivi cu literalul -
și în funcție de modul în care sunt interpretate expresiile regulate în .nanorc
, fie
- trebuie să-l scape (adică
\-
) sau - să-l plasezi primul sau ultimul în caracter listă (adică
[-etc]
sau[etc-]
) care ar fi standard în expresiile regulate POSIX și GNU și, prin urmare, cea mai probabilă soluție pe un sistem Linux .
Vezi de ex. aici pentru referințe suplimentare.
Avertisment : Afirmația de mai sus " [a-z]
fiind prescurtată pentru [abcdefghijkl...xyz]
este nu este necondiționat adevărat ! Modul în care este interpretat intervalul depinde de setările locale, în special de ordinea de colaționare.
- În " C " locale, ordinea este conform valorii codului ASCII, adică
ABC...XYZ...abc...xyz
. Aici,[a-z]
înseamnă de fapt " toate caracterele mici ". - În majoritatea celorlalte limbi, majusculele și minusculele sunt grupate împreună, adică ordinea este
aAbBcC...xXyYzZ
. Aici,[a-z]
ar însemna " toate caracterele mici și toate caracterele majuscule, cu excepțiaZ
. - Tratamentul caracterelor non-ASCII, cum ar fi " umlaut ", este încă o altă problemă.
Consultați aici și aici pentru discuții suplimentare pe această temă.
Răspuns
Lipirea acestuia la https://regexr.com/ ajută la depanare mai bine.
Nu ați scăpat de -
în interval, ca -
este folosit pentru a specifica intervalul.
Vechi:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Corecție:
cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/
Comentarii
- Vă mulțumim pentru link
- Scăparea unei liniuțe într-o expresie între paranteze nu ar ajuta. Rețineți că barele înapoi nu au o semnificație specială pentru expresia din
[...]
. Aceasta înseamnă, de asemenea, că[\.]
se potrivește cu un punct sau o bară inversă. - Chiar? Mă îndoiesc. Pentru a potrivi slash înainte, trebuie să o scăpați de două ori \\ pentru a o potrivi
- @JamesJohn Încercați de ex.
grep '[\]' <<<'\'
saugrep -o '[\.]' <<<'123\.abc'
- Inserați problema în grep și vedeți eroarea, apoi aplicați remedierea pentru a o remedia
-
): aceasta poate fi interpretată ca un interval …