logi sisse meist KKK

Probleem selline, vaja parsida NMEA andmeid ja enamasti saab hakkama regulaaravaldisega, aga mõni lause sisaldab muutuva pikkusega loetelu. Regulaaravaldis:

 ^\$GPGSA,(A|M),(\d{1}),(,|\d{2},)+(\d+\.\d+),(\d+\.\d+),(\d+\.\d+)\*(\d{2})$

Testimissisend:

$GPGSA,A,3,02,05,04,10,12,23,31,,,,,,2.7,1.3,2.4*31

Praeguse regulaaravaldise rakendamine annab väljundi

0:"$GPGSA,A,3,02,05,04,10,12,23,31,,,,,,2.7,1.3,2.4*31"
1:"A"
2:"3"
3:","
4:"2.7"
5:"1.3"
6:"2.4"
7:"31"

Võtmekoht on regulaaravaldise osa "(,|d{2},)+". Kolmas tulemus võiks anda koma asemel kogu loetelu "02,05,04,10,12,23,31,,,,,,". Kas seda oleks võimalik kuidagi sellisena kinni püüda? Ma tahaks vältida sisendi käsitsi parsimist nii palju kui võimalik. Muidu võiksin sisendi lihtsalt splittida, aga lõpus on mõned loetelusse mittekuuluvad omadused (komaga arvud).

küsitud Oct 18 '13 at 11:02

Teet65's gravatar image

Teet65
174911

edited Oct 18 '13 at 15:49


Päris täpselt aru ei saanud küsimusest, aga ühe regex-grupiga mitut sisendit kätte ei saa. Saab defineerida ühe grupi, mis kasutab "non-capturing" gruppe. Näiteks:

 ^\$GPGSA,(A|M),(\d),((?:,|\d\d,)+)(\d+\.\d+),(\d+\.\d+),(\d+\.\d+)\*(\d\d)$

Loomulikult, soovitaks pigem otsida sobiv teek NMEA parsimise jaoks.

link

vastatud Oct 18 '13 at 23:00

egon's gravatar image

egon ♦♦
771239

Njah, see regulaaravaldise teek, mida praegu kasutan, ei toeta "(?:" (ei hakka põhjendama, miks ma nii viletsat asja kasutan), kuigi see oleks lahenduseks küll. võibolla püüan kinni terve stringi kuni esimese komaga arvuni ning testin ja jagan siis seda eraldi.

(Oct 19 '13 at 23:16) Teet65

Esimene vastus on jah see, et kasuta NMEA teeki. Sedasorti protokollide põlve otsas parsimine on tuhande turva- ja muu probleemi vanaema.

Aga kui regulaaravaldiste juurde minna, siis mõtle sedapidi, et NMEA GPGSA positsioonid 3-14 on kõik kujul ",([0-9])*" ning neid on fikseeritud arv. Kui protokolli kirjeldus annab Sulle fikseeritud elementide arvu, siis on kõigiti lollikindlam seda arvu oma parseris ka päriselt kasutada.

link

vastatud Dec 03 '13 at 09:15

Mart%20Oruaas's gravatar image

Mart Oruaas
211

Tegelikult õnnestus mul regulaaravaldise teek välja vahetada uue vastu, mis toetab "non-capturing"ut.

Õigupoolest ei mõista ma, kuidas regulaaravaldised üldiselt turvaohuga on, sest avaldis määrab sisendi küllaltki kitsate piiridega eeskuju järgi ära. Selline kartus tundub rohkem "hunt metsas"-hirmu moodi olevat, millel iseenesest alust ei ole. Aga oleksin muidugi sellistest viidetest huvitatud.

(Dec 03 '13 at 14:32) Teet65

Ei, ma ei pidanud silmas regulaaravaldisi, regulaarsed keeled kui pea kõige lihtsamad formaalsed keeled on vastavalt ka kõige lihtsamini ning ohutumalt parsitavad (kuigi paljud popid regexi-librad võimaldavad tegelikult parsida ka kontekstivabu keeli, mis teeb asja kohe keerulisemaks). Üldise "teeme ise protokolliparseri" praktika kohta käis see. Samas selle "hunt metsas" kohta: lugedes Su algset küsimust ning seal toodud regulaaravaldist, kas Sa täna suudad tõestada, et Su parser sööb ära kõikvõimalikud sisendid, andes garanteeritult tulemuseks kas vea või korrektselt parsitud stuktuuri?

(Dec 03 '13 at 16:28) Mart Oruaas
Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×6
×1

küsitud: Oct 18 '13 at 11:02

nähtud: 2,671 korda

viimati uuendatud: Dec 03 '13 at 16:30

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee