Kan du hjelpe med denne regexen i sourceslist.nanorc?

Regex:

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

Feil:

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

Takk.

Kommentarer

  • Kanskje du bør unnslippe dash (-): dette kan tolkes som et område …

Svar

Problemet er sannsynligvis plasseringen av - -tegnet i tegnlisten din.

Du har allerede brukt det faktum at rekkevidden av tegn kan uttrykkes ved at [start-end], som i [a-z] som forkortelse for [abcdefghijkl...xyz] (skjønt se advarselen nedenfor). Det betyr at - er et spesialtegn, og hvis det forekommer mellom to " vanlig " tegn, tolkes det slik at det indikerer enda et område som omfatter disse to tegnene og alle i mellom.

Dette fungerer selvfølgelig bare hvis tegnet etter - er leksikografisk " senere " i sorteringsrekkefølgen og deretter tegnet foran det, som også er årsaken til feilmeldingen din (du vil se at det forsvinner hvis du sier (-_ i stedet, selv om det ikke løser problemet ditt ).

Siden du åpenbart vil ha for å matche det bokstavelige -, og avhengig av hvordan vanlige uttrykk tolkes i .nanorc , du enten

  • må unnslippe den (dvs. \-), eller
  • plasser den først eller sist i tegnet liste (dvs. [-etc] eller [etc-]) som ville være standard i POSIX og GNU regulære uttrykk den mest sannsynlige løsningen på et Linux-system .

Se f.eks. her for nærmere referanse.

Advarsel : Uttalelsen ovenfor " [a-z] å være stenografi for [abcdefghijkl...xyz] er ikke ubetinget sant ! Hvordan rekkevidden tolkes, avhenger av lokalinnstillingene, spesielt sorteringsrekkefølgen.

  • I " C " locale, er rekkefølgen i henhold til ASCII-kodeverdi, dvs. ABC...XYZ...abc...xyz. Her betyr [a-z] faktisk " alle små bokstaver ".
  • I de fleste andre lokaler er store og små bokstaver gruppert sammen, dvs. at rekkefølgen er aAbBcC...xXyYzZ. Her vil [a-z] bety " alle små bokstaver og alle store bokstaver unntatt Z.
  • Behandlingen av ikke-ASCII-tegn som " umlauts " er enda et problem.

Se her og her for ytterligere diskusjoner om emnet.

Svar

Limer dette inn på https://regexr.com/ hjelper med å feilsøke bedre.

Du slapp ikke - i området, da - brukes til å spesifisere rekkevidde.

Gammel:

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

Retting:

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

Kommentarer

  • Takk for lenken
  • Å unnslippe en bindestrek i et parentesuttrykk hjelper ikke. Vær oppmerksom på at tilbakeslag ikke har noen spesiell betydning for uttrykket i [...]. Dette betyr også at [\.] samsvarer med en prikk eller et tilbakeslag.
  • Virkelig? Jeg tviler. For å matche skråstrek, må du unnslippe den to ganger \\ for å matche den
  • @JamesJohn Prøv f.eks. grep '[\]' <<<'\', eller grep -o '[\.]' <<<'123\.abc'
  • Lim problemet inn i grep og se feilen, og bruk deretter min løsning for å fikse det

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *