JavaRush /Blog Jawa /Random-JV /RegEx: 20 langkah singkat kanggo nguwasani ekspresi regul...
Artur
tingkat
Tallinn

RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler. Bagean 2

Diterbitake ing grup
RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler. Part 1 Original kene Ing bagean pungkasan kita nguwasani ekspresi reguler paling gampang, lan wis sinau soko. Ing bagean iki kita bakal nyinaoni desain sing rada rumit, nanging pracaya marang aku, ora bakal angel kaya sing katon. RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 2 - 1Dadi ayo terus!

Langkah 8: *Tandha Bintang lan Plus+

RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 2 - 2Supaya adoh, kita wis luwih utawa kurang mung bisa cocog strings saka dawa tartamtu. Nanging ing masalah paling anyar kita wis nyedhaki watesan apa sing bisa kita lakoni karo notasi sing kita deleng nganti saiki. Ayo dadi nganggep, contone, sing kita ora winates kanggo 3-karakter Jawa pengenal, nanging kita bisa duwe pengenal saka sembarang dawa. Solusi sing bisa digunakake ing conto sadurunge ora bakal bisa digunakake ing conto ing ngisor iki:
pola: [a-zA-Z_$]\w\w 
string:   __e $12 3 3.2 fo Bar r a23 mm ab x
cocog: ^^^ ^^^ ^^^ ^^^  
( Conto ) cathetanyen pengenal valid nanging luwih saka 3 karakter, mung telung karakter pisanan sing cocog. Lan nalika pengenal bener, nanging ngemot kurang saka 3 karakter, banjur regex ora nemokake iku ing kabeh! Masalahe yaiku ekspresi kurung []cocog karo siji karakter, kaya kelas karakter kayata \w. Iki tegese saben cocog ing ekspresi reguler ndhuwur kudu persis telung karakter. Dadi ora bisa kaya sing dikarepake. *Karakter khusus lan bisa mbantu kene +. Iki minangka modifier sing bisa ditambahake ing sisih tengen ekspresi apa wae kanggo cocog karo ekspresi kasebut luwih saka sepisan. Kleene Star (utawa "tanda bintang") *bakal nuduhake yen token sadurunge kudu dicocogake kaping pirang-pirang, kalebu nol kaping. Tandha plus +bakal nuduhake yen sampeyan kudu nggoleki siji utawa luwih. Mangkono, ekspresi sing sadurunge +iku wajib (paling ora sapisan), dene ekspresi sing ana ing ngarep *iku opsional, nanging yen katon, bisa katon kaping pirang-pirang. Saiki, kanthi kawruh iki, kita bisa mbenerake ekspresi reguler ing ndhuwur:
pola: [a-zA-Z_$]\w* 
string:   __e $123 3.2 kanggo Barr a23mm ab x 
cocog: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^ 
( Conto ) Saiki kita cocog karo pengenal sing sah saka sembarang dawa! Bingo! Nanging apa sing bakal kelakon yen kita +nggunakake *?
pola: [a-zA-Z_$]\w+ 
string:   __e $123 3.2 kanggo Barr a23mm ab x
cocog: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ 
( Conto ) Kita ora kejawab pertandhingan pungkasan х,. Iki amarga mbutuhake +paling ora siji karakter sing dicocogake, nanging amarga ekspresi kurung []sadurunge \w+wis 'mangan' karakter kasebut x, ora ana karakter liyane sing kasedhiya, mula pertandhingan kasebut gagal. Nalika kita bisa nggunakake +? Nalika kita kudu golek paling siji match, nanging ora ketompo carane kakehan expression diwenehi kudu cocog. Contone, yen kita pengin nemokake nomer sing ngemot titik desimal:
pola: \d*\.\d+ 
string:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 
cocog: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
( Conto ) cathetansing nggawe nomer ing sisih kiwa titik desimal opsional, kita bisa nemokake loro 0,011 lan .2. Kanggo nindakake iki, kita kudu cocog persis siji titik desimal \.lan paling sethithik siji digit ing sisih tengen titik desimal karo \d+. Ekspresi reguler ing ndhuwur ora cocog karo angka kaya 3., amarga kita butuh paling sethithik siji digit ing sisih tengen titik desimal kanggo cocog.

Kaya biasane, ayo ngrampungake sawetara masalah sing gampang:

Temokake kabeh tembung Inggris ing wacana ing ngisor iki.
pola:
string: 3 ditambah 3 iku enem nanging 4 ditambah telu iku 7
cocog:    ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^ 
( Solusi ) Temokake kabeh simbol ukuran file ing dhaptar ing ngisor iki. Ukuran file bakal kalebu nomer (kanthi utawa tanpa titik desimal) diikuti dening KB, MB, GButawa TB:
pola:
string:   11TB 13 14.4MB 22HB 9.9GB TB 0KB 
cocog: ^^^^ ^^^^^^ ^^^^^ ^^^  
( Solusi )

Langkah 9: tandha pitakon "opsional".?

RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 2 - 3Apa sampeyan wis nulis regex kanggo ngatasi masalah pungkasan? Apa iku bisa? Saiki coba aplikasi ing kene:
pola:
string: 1..3KB 5...GB ..6TB
cocog:  
Temenan, ora ana sebutan kasebut minangka ukuran file sing bener, mula ekspresi reguler sing apik ora cocog karo salah sijine. Solusi sing aku tulis kanggo ngatasi masalah pungkasan cocog karo kabeh, paling ora sebagian:
pola: \d+\.*\d*[KMGT]B 
string:   1..3KB  5...GB .. 6TB 
cocog: ^^^^^^ ^^^^^^ ^^^ 
( Tuladha ) Lantas apa masalahe? Nyatane, kita mung kudu golek siji titik desimal, yen ana siji. Nanging *ngidini sawetara pertandhingan, kalebu nul. Apa ana cara kanggo cocog mung nul kaping utawa siji wektu? Nanging ora luwih saka sepisan? Mesthi wis. "opsional" ?minangka modifier sing cocog karo nol utawa salah siji saka karakter sadurunge, nanging ora luwih:
pola: \d+\.?\d*[KMGT]B 
string: 1.. 3KB 5...GB .. 6TB 
cocog:     ^^^ ^^^ 
( Conto ) Kita luwih cedhak karo solusi ing kene, nanging iki dudu sing dibutuhake. Kita bakal weruh carane ndandani iki ing sawetara langkah mengko.

Ing sawetoro wektu, ayo ngatasi masalah iki:

Ing sawetara basa pamrograman (umpamane Jawa), sawetara angka integer lan titik ngambang (titik) bisa diterusake kanthi l/ Llan f/ Fkanggo nunjukake yen kudu dianggep dawa / ngambang (masing-masing) tinimbang minangka int / pindho biasa. Temokake kabeh nomer "dawa" sing bener ing baris ing ngisor iki:
pola:
string:   13L dawa 2l 19 L lL 0 
cocog: ^^^ ^^ ^^ ^ 
( Solusi )

Langkah 10: tandha "utawa".|

RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 2 - 4Ing langkah 8, kita ngalami sawetara kangelan nemokake macem-macem jinis nomer floating point:
pola: \d*\.\d+ 
string:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 
cocog: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
Pola ing ndhuwur cocog karo angka kanthi titik desimal lan paling ora siji digit ing sisih tengen titik desimal. Nanging apa yen kita uga pengin cocog strings kaya 0.? (Ora ana angka ing sisih tengen titik desimal.) Kita bisa nulis ekspresi reguler kaya iki:
pola: \d*\.\d* 
string:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 
cocog: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ ^ 
( Conto ) Iki cocog 0., nanging uga cocog karo siji titik ., kaya sing sampeyan deleng ing ndhuwur. Sejatine sing kita coba cocog yaiku rong kelas string sing beda:
  1. nomer karo paling siji digit ing sisih tengen titik desimal
  2. nomer karo paling siji digit ing sisih kiwa titik desimal
Ayo nulis 2 ekspresi reguler ing ngisor iki, bebas saka siji liyane:
pola: \d*\.\d+ 
string:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
cocog: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
pola: \d+\.\d* 
string:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
cocog: ^^^^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
We ndeleng sing ora ana kasus iki substrings 42, 5, 6utawa .ditemokaké dening engine. Kanggo entuk asil sing dibutuhake, ora bakal ngrusak kita nggabungake ekspresi reguler kasebut. Kepiye carane bisa nggayuh iki? Tandha "utawa" |ngidini kita nemtokake sawetara urutan pertandhingan bebarengan ing ekspresi biasa. Kaya []tandha "utawa" ngidini kita nemtokake karakter siji alternatif, |kita bisa nemtokake ekspresi multi-karakter alternatif. Contone, yen kita pengin nemokake "asu" utawa "kucing", kita bisa nulis kaya iki:
pola: \w\w \ w 
string:   Temenan , asu luwih apik tinimbang kucing .
cocog: ^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^ ^^^ 
( Conto ) ... nanging iki cocog karo kabeh urutan karakter telung kelas "tembung". Nanging "asu" lan "kucing" ora duwe huruf sing padha, mula kurung kotak ora bakal mbantu kita ing kene. Iki ekspresi reguler sing paling gampang sing bisa digunakake sing cocog karo loro lan mung rong tembung iki:
pola: asu|cat 
string: Temenan, asu iku pet sing luwih apik tinimbang kucing .
cocog:               ^^^ ^^^ 
( Conto ) Mesin ekspresi reguler pisanan nyoba cocog kabeh urutan ing sisih kiwa karakter |, nanging yen gagal, banjur nyoba kanggo cocog urutan ing sisih tengen karakter |. Akeh karakter |uga bisa dirantai supaya cocog karo luwih saka rong urutan alternatif:
pola: asu|kucing| 
tali pet: Temenan, asu luwih apik tinimbang kucing .
cocog:               ^^^ ^^^ ^^^ 
( Conto )

Saiki ayo ngrampungake sawetara masalah liyane supaya luwih ngerti langkah iki:

Gunakake tandha |kanggo mbenerake ekspresi reguler desimal ing ndhuwur kanggo ngasilake asil kaya iki:
pola:
senar:   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
cocog: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
( Solusi ) Gunakake tandha |, kelas karakter, "opsional" ?, lan liya-liyane kanggo nggawe ekspresi reguler siji sing cocog karo nomer integer lan titik ngambang (titik), kaya sing dibahas ing masalah ing pungkasan langkah sadurunge (masalah iki rada sithik. luwih rumit, ya ;))
pola:
senar:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
cocog: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^  
( Solusi ) 20 langkah singkat kanggo nguwasani ekspresi reguler. Part 3 RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler. Bagean 4
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION