Kan du hjælpe med denne regex i min sourceslist.nanorc?

Regex:

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

Fejl:

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

Tak.

Kommentarer

  • Måske skulle du slippe for bindestreg (-): dette kan fortolkes som et interval …

Svar

Problemet er sandsynligvis placeringen af - -tegnet i din tegneliste.

Du har allerede brugt det faktum, at tegnintervaller kan udtrykkes ved, at [start-end], som i [a-z] er stenografi for [abcdefghijkl...xyz] (skønt se advarslen nedenfor). Det betyder, at - er et specielt tegn, og hvis det forekommer mellem to " almindeligt " tegn fortolkes det som en indikation af endnu et område, der omfatter disse to tegn og alle derimellem.

Dette fungerer selvfølgelig kun, hvis tegnet efter - er leksikografisk " senere " i sorteringsrækkefølgen, så tegnet forud for det, hvilket også er årsagen til din fejlmeddelelse (du vil se, at det forsvinder, hvis du i stedet siger (-_, selvom det ikke løser dit problem ).

Da du naturligvis vil have for at matche den bogstavelige - og afhængigt af hvordan regulære udtryk fortolkes i .nanorc , skal du enten

  • skal undslippe det (dvs. \-) eller
  • placere det først eller sidst i tegnet liste (dvs. [-etc] eller [etc-]) som ville være standard i POSIX og GNU regulære udtryk den mest sandsynlige løsning på et Linux-system .

Se f.eks. her til yderligere reference.

Advarsel : Udsagnet ovenfor " [a-z] at være stenografi for [abcdefghijkl...xyz] er ikke ubetinget sandt ! Hvordan rækkevidden fortolkes afhænger af landets indstillinger, specifikt sorteringsrækkefølgen.

  • I " C " locale, rækkefølgen er i overensstemmelse med ASCII-kodeværdien, dvs. ABC...XYZ...abc...xyz. Her betyder [a-z] faktisk " alle små bogstaver ".
  • I de fleste andre lokaliteter er store og små bogstaver grupperet sammen, dvs. rækkefølgen er aAbBcC...xXyYzZ. Her vil [a-z] betyde " alle små bogstaver og alle store bogstaver undtagen Z.
  • Behandlingen af ikke-ASCII-tegn som " umlauts " er endnu et problem.

Se her og her for yderligere diskussioner om emnet.

Svar

Indsætter dette på https://regexr.com/ hjælper med at debugge bedre.

Du undslap ikke - i området, da - bruges til at specificere rækkevidde.

Gammel:

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

Rettelse:

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

Kommentarer

  • Tak for linket
  • At undslippe en bindestreg i et parentes udtryk hjælper ikke. Bemærk, at tilbageslag ikke har nogen særlig betydning for udtrykket inde i [...]. Dette betyder også, at [\.] matcher en prik eller et tilbageslag.
  • Virkelig? Jeg tvivler. For at matche skråstreg, skal du undslippe den to gange \\ for at matche den
  • @JamesJohn Prøv f.eks. grep '[\]' <<<'\' eller grep -o '[\.]' <<<'123\.abc'
  • Indsæt problemet i grep og se fejlen, og anvend derefter min rettelse for at rette det

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *