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

  • Možná byste měli uniknout pomlčkou (-): toto může být interpretováno jako rozsah …

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.

Další diskuse na toto téma najdete zde a zde .

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 '[\]' <<<'\' nebo grep -o '[\.]' <<<'123\.abc'
  • Vložte problém do grepu a podívejte se na chybu, pak ji opravte opravou

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *