Kan du hjälpa till med denna regex i min sourceslist.nanorc?

Regex:

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

Fel:

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

Tack.

Kommentarer

  • Du kanske kanske ska undkomma strecket (-): detta kan tolkas som ett intervall …

Svar

Problemet är sannolikt placeringen av - -tecknet i din karaktärslista.

Du har redan använt det faktum att teckenintervall kan uttryckas genom att [start-end], som i [a-z] som förkortning för [abcdefghijkl...xyz] (men se varningen nedan). Det betyder att - är ett specialtecken, och om det förekommer mellan två " vanliga " tecken, det tolkas som att det anger ytterligare ett intervall som omfattar dessa två tecken och var och en däremellan.

Detta fungerar naturligtvis bara om tecknet efter - är lexikografiskt " senare " i sorteringsordningen och sedan tecknet före det, vilket också är orsaken till ditt felmeddelande (du ser att det försvinner om du säger (-_ istället, även om det inte löser ditt problem ).

Eftersom du uppenbarligen vill för att matcha bokstavligt - och beroende på hur reguljära uttryck tolkas i .nanorc , antingen

  • måste fly det (dvs. \-), eller
  • placera det först eller sist i tecknet lista (dvs. [-etc] eller [etc-]) vilket skulle vara standard i POSIX- och GNU-reguljära uttryck den mest troliga lösningen på ett Linux-system .

Se t.ex. här för ytterligare referens.

Förbehåll : Uttrycket ovan " [a-z] är förkortning för [abcdefghijkl...xyz] är inte ovillkorligt sant ! Hur intervallet tolkas beror på språkinställningarna, särskilt sorteringsordningen.

  • I " C " locale, ordern är enligt ASCII-kodvärde, dvs ABC...XYZ...abc...xyz. Här betyder [a-z] faktiskt " alla små bokstäver ".
  • På de flesta andra platser grupperas stora och små bokstäver, dvs. ordningen är aAbBcC...xXyYzZ. Här skulle [a-z] betyda " alla gemener och alla versaler utom Z.
  • Behandlingen av icke-ASCII-tecken som " umlauts " är ännu ett problem.

Se här och här för ytterligare diskussioner om ämnet.

Svar

Klistrar in det på https://regexr.com/ hjälper till att felsöka bättre.

Du slapp inte från - i intervallet, eftersom - används för att specificera intervall.

Gammalt:

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

Korrigering:

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

Kommentarer

  • Tack för länken
  • Att undkomma ett streck i ett parentesuttryck hjälper inte. Observera att snedstreck inte har någon speciell betydelse för uttrycket inuti [...]. Det betyder också att [\.] matchar en punkt eller en backslash.
  • Verkligen? Jag tvivlar. För att matcha snedstrecket måste du fly undan det två gånger \\ för att matcha det
  • @JamesJohn Prova t.ex. grep '[\]' <<<'\', eller grep -o '[\.]' <<<'123\.abc'
  • Klistra in problemet i grep och se felet och använd sedan min fix för att fixa det

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *