Hei,
Tuli viime viikolla tarve opiskella säännöllisiä lausekkeita. Juuri nyt mitenkään keksi miten ratkaisisin seuraavan ongelman:
Merkkijonoista alla haluaisin poimia 1-2 ensimmäistä numeroa(lihavoidut), jos seuraava merkki ei ole numero:
2111-3000
03
02m
03(RR)
5m
Testerissä lauseke (^\d{1,2})[\D] näyttäisi toimivan, mutta VB:ssä jättää palauttamatta numerot 2. riviltä, eli merkkijono jossa 3. merkki ei ole mitään.
Dim x As MatchCollection = Regex.Matches(TestString, "(^\d{1,2})[\D]")
Lauseke siis ajetaan aina yhdelle riville kerrallaan.
Missä menen metsään?
Tuossa lausekkeessa vaadit, että yhden tai kahden numeron jälkeen on jokin merkki, joka ei ole numero.
En ole RegEx expertti, mutta jokin tällainen voisi toimia
^(\d\d?)(\D.*)?$
Eli
1. ensin rivin alku ^
2. sitten yksi tai kaksi numeroa: (\d\d?) tämä siis sama kuin (\d{1,2})
3. sitten joko ei-numero ja mitä tahansa tai ei mitään: (\D.*)?
4. ja lopuksi rivin loppu $
Tosiaan tyhjän merkkijonon mahdollisuus puuttuu. Testi netissä onnistuu siksi, että koko teksti on yhtenä palana ja hakasulkumerkintä poimii seuraavaksi merkiksi 03:n jälkeisen rivinvaihdon (tai ehkä pelkän \r-merkin).
Grezin korjauksen (\D.*)?$ voi yksinkertaistaa muotoon (\D|$) eli ei-numero tai loppu. Toinen vaihtoehto olisi käänteinen tarkastus (?!\d) eli seuraavaksi ei numeroa.
VB.NETissä \d hyväksyy myös muita Unicode-numeroita, mm. 76, ٤٢, ໑໓ ja nämä jännästi oikealta vasemmalle käyttäytyvät N'Ko-merkit: "߅߇߈".
Eli jos haluat hakea vain ASCII-numeroita 0–9, käytä tähän sopivaa hakasulkumerkintää \d:n ja \D:n tilalla.
ok, kiitoksia, sain homman toimimaan...
Aihe on jo aika vanha, joten et voi enää vastata siihen.