Voitteko auttaa tässä regexissä sourceslist.nanorc?

Regex:

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

Virhe:

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

Kiitos.

Kommentit

  • Ehkä sinun pitäisi välttää viiva (-): tämä voidaan tulkita alueeksi …

Vastaus

Ongelma on todennäköisesti - -merkin sijoittaminen merkkiluetteloon.

Olet jo käyttänyt sitä, että merkkialueet voidaan ilmaista [start-end], kuten siinä, että [a-z] on lyhenne sanoista [abcdefghijkl...xyz] (vaikka katso varoitus alla). Tämä tarkoittaa, että - on erikoismerkki ja jos se esiintyy kahden " säännöllisen " -merkkien, sen tulkitaan osoittavan vielä yhden alueen, joka käsittää nämä kaksi merkkiä ja kaikki välissä olevat.

Tämä toimii tietysti vain, jos merkin - on leksikografisesti " myöhemmin " lajittelujärjestyksessä kuin sitä edeltävä merkki, mikä on myös syy virheilmoituksellesi ( huomaa, että se katoaa, jos sanot sen sijaan (-_, vaikka se ei ratkaise ongelmaa ).

Koska haluat tietysti vastaamaan kirjaimellista - ja sen mukaan, miten säännölliset lausekkeet tulkitaan .nanorc , joko

  • täytyy välttää se (ts. \-) tai
  • sijoittaa se ensimmäiseen tai viimeiseen merkkiin luettelo (ts. [-etc] tai [etc-]), joka olisi vakiona POSIX- ja GNU-säännöllisissä lausekkeissa ja siksi todennäköisin ratkaisu Linux-järjestelmässä .

Katso esim. täällä lisätietoa varten.

Varoitus : Yllä oleva lauseke " [a-z] on lyhenne sanoille [abcdefghijkl...xyz] on ei ehdoitta totta ! Alueen tulkinta riippuu kieliasetuksista, erityisesti lajittelujärjestyksestä.

  • " C " locale, järjestys on ASCII-koodiarvon mukainen, ts. ABC...XYZ...abc...xyz. Tässä [a-z] tarkoittaa itse asiassa " kaikkia pieniä kirjaimia ".
  • Useimmissa muissa kielialueissa isot ja pienet kirjaimet ryhmitellään yhteen, ts. Järjestys on aAbBcC...xXyYzZ. Tässä [a-z] tarkoittaisi " kaikkia pieniä ja suuria merkkejä paitsi Z.
  • Muiden kuin ASCII-merkkien, kuten " umlauts ", käsittely on jälleen yksi asia.

Katso täältä ja täältä , jos haluat keskustella aiheesta lisää.

Vastaus

Tämän liittäminen osoitteeseen https://regexr.com/ auttaa virheenkorjausta paremmin.

Et välttynyt alueelta -, koska - käytetään määrittämään alue.

Vanha:

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

Korjaus:

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

Kommentit

  • Kiitos linkistä
  • Viivasta pakeneminen sulkeissa olevaan lausekkeeseen ei auta. Huomaa, että taaksepäin osoittavilla viivoilla ei ole erityistä merkitystä [...] -ilmaisun sisällä. Tämä tarkoittaa myös, että [\.] vastaa pistettä tai vinoviivaa.
  • Todella? Epäilen. Jos haluat sovittaa eteenpäin kauttaviivan, sinun on vältettävä sitä kahdesti \\ vastaamaan sitä
  • @JamesJohn Kokeile esim. grep '[\]' <<<'\' tai grep -o '[\.]' <<<'123\.abc'
  • Liitä ongelma grepiin ja näe virhe ja korjaa se sitten korjaustiedostolla

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *