Czy możesz pomóc z tym wyrażeniem regularnym w moim sourceslist.nanorc?

Regex:

 cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/  

Błąd:

 Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end  

Dziękuję.

Komentarze

  • Może powinieneś pominąć myślnik (-): może to zostać zinterpretowane jako zakres …

Odpowiedź

Prawdopodobnie problemem jest umieszczenie - znaku na liście znaków.

Wykorzystałeś już fakt, że zakresy znaków można wyrazić za pomocą [start-end], jak w [a-z] będącym skrótem dla [abcdefghijkl...xyz] (chociaż zobacz poniższe zastrzeżenie). Oznacza to, że - jest znakiem specjalnym i jeśli występuje między dwoma " zwykłym ", jest interpretowane jako wskazanie kolejnego zakresu obejmującego te dwa znaki i każdy pomiędzy nimi.

Oczywiście działa to tylko wtedy, gdy znak po - jest leksykograficznie " później " w kolejności sortowania, a następnie poprzedzający go znak, który jest również przyczyną komunikatu o błędzie (Ty zobaczy, że zniknie, jeśli zamiast tego powiesz (-_, chociaż to nie rozwiąże problemu ).

Ponieważ oczywiście chcesz aby dopasować literał - i w zależności od interpretacji wyrażeń regularnych w .nanorc , możesz

  • musisz go zmienić (tj. \-) lub
  • umieścić go jako pierwszy lub ostatni w znaku lista (tj. [-etc] lub [etc-]), co byłoby standardem w wyrażeniach regularnych POSIX i GNU i dlatego najbardziej prawdopodobne rozwiązanie w systemie Linux .

Zobacz np. tutaj w celu uzyskania dalszych informacji.

Caveat : powyższa instrukcja " [a-z] będąca skrótem dla [abcdefghijkl...xyz] to nie bezwarunkowo prawdziwe ! Interpretacja zakresu zależy od ustawień regionalnych, w szczególności kolejności sortowania.

  • W " C " locale, kolejność jest zgodna z wartością kodu ASCII, tj. ABC...XYZ...abc...xyz. Tutaj [a-z] w rzeczywistości oznacza " wszystkie małe litery ".
  • W większości innych języków duże i małe litery są zgrupowane razem, tj. Kolejność to aAbBcC...xXyYzZ. W tym przypadku [a-z] oznaczałoby " wszystkie małe i wielkie litery oprócz Z.
  • Sposób traktowania znaków spoza zestawu ASCII, takich jak " umlauts ", to kolejny problem.

Zobacz tutaj i tutaj , aby uzyskać dalsze dyskusje na ten temat.

Odpowiedź

Wklejanie tego w https://regexr.com/ ułatwia debugowanie.

Nie zmieniono znaczenia - w zakresie, ponieważ - służy do określenia zakresu.

Stare:

cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/ 

Korekta:

cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/ 

Komentarze

  • Dziękuję za link
  • Zamiana myślnika w wyrażeniu w nawiasach nie pomoże. Zauważ, że ukośniki odwrotne nie mają specjalnego znaczenia dla wyrażenia wewnątrz [...]. Oznacza to również, że [\.] pasuje do kropki lub ukośnika.
  • Naprawdę? Wątpię. Aby dopasować ukośnik, musisz dwukrotnie go zmienić \\, aby go dopasować
  • @JamesJohn Spróbuj np. grep '[\]' <<<'\' lub grep -o '[\.]' <<<'123\.abc'
  • Wklej problem w grep i zobacz błąd, a następnie zastosuj moją poprawkę, aby go naprawić

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *