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
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óczZ
. - 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 '[\]' <<<'\'
lubgrep -o '[\.]' <<<'123\.abc'
- Wklej problem w grep i zobacz błąd, a następnie zastosuj moją poprawkę, aby go naprawić
-
): może to zostać zinterpretowane jako zakres …