Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: RegEx: Kaksi ensimmäistä numeroa

ari kood [04.02.2019 09:12:07]

#

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?

Grez [04.02.2019 11:37:45]

#

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 $

Metabolix [04.02.2019 13:16:34]

#

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.

ari kood [04.02.2019 17:17:12]

#

ok, kiitoksia, sain homman toimimaan...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta