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 4

Diterbitake ing grup
RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler. Part 1 RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler. Part 2 20 langkah-langkah singkat kanggo nguwasani ekspresi reguler. Bagean 3 Bagean pungkasan iki, ing tengah, bakal nyentuh bab-bab sing biasane digunakake dening master ekspresi reguler. Nanging materi saka bagean sadurunge gampang kanggo sampeyan, ta? Iki tegese sampeyan bisa nangani materi iki kanthi gampang! Asli ing kene RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 4 - 1 <h2>Langkah 16: grup tanpa njupuk (?:)</h2> RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 4 - 2Ing rong conto ing langkah sadurunge, kita njupuk teks sing ora kita butuhake. Ing tugas Ukuran File, kita njupuk spasi sadurunge digit pisanan ukuran file, lan ing tugas CSV, kita njupuk koma ing antarane saben token. Kita ora perlu njupuk karakter iki, nanging kita kudu nggunakake kanggo struktur ekspresi reguler kita. Iki pilihan becik kanggo nggunakake grup tanpa njupuk (?:),. Klompok non-capturing nindakake persis kaya swarane - ngidini karakter diklompokaké lan digunakake ing ekspresi reguler, nanging ora dijupuk ing grup nomer:
pola: (?:")([^"]+)(?:") 
string: Aku mung pengin "teks nang kuotasi iki" .
cocog:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
kelompok:                 11111111111111111111111111111    
( Tuladha ) Ekspresi reguler saiki cocog karo teks sing dikutip uga karakter kutipan dhewe, nanging klompok panangkep mung njupuk teks sing dikutip. Yagene kita kudu nindakake iki? Intine yaiku umume mesin ekspresi reguler ngidini sampeyan mbalekake teks saka grup panangkepan sing ditetepake ing ekspresi reguler. Yen kita bisa motong karakter ekstra sing ora kita butuhake tanpa kalebu ing grup panangkepan kita, iku bakal luwih gampang kanggo parse lan ngapusi teks mengko. Mangkene carane ngresiki parser CSV saka langkah sadurunge:
pola: (?:^|,)\s*(?:\"([^",]*)\"|([^", ]*)) 
string:   a , " b ", " cd ", e , f , " gh ", dfgi ,, k , "", l 
cocog: ^ ^ ^^^ ^ ^ ^^^ ^^^^ ^ ^ 
klompok:    2 1 111 2 2 111 2222 2 2    
( Conto ) Ana sawetara bab sing kudu <tandhani>katon ing kene:</mark> Kaping pisanan, kita ora njupuk koma maneh amarga ngganti grup sing njupuk (^|,)menyang grup sing ora njupuk (?:^|,). Kapindho, kita nested grup panangkepan ing grup non-capture. Iki migunani nalika, contone, sampeyan mbutuhake klompok karakter kanggo katon ing urutan tartamtu, nanging sampeyan mung Care babagan subset saka karakter kasebut. Ing kasus kita, kita mbutuhake karakter non- kutipan lan non- koma [^",]*kanggo katon ing kuotasi, nanging kita ora perlu karakter kuotasi dhewe, supaya padha ora perlu dijupuk. Pungkasan, <mark>cathet</mark> yen ing conto ing ndhuwur uga ana pertandhingan dawa nol antarane karakter klan l. Kuotasi ""minangka substring sing digoleki, nanging ora ana karakter ing antarane tanda kutip, mula substring sing cocog ora ana karakter (dawa nol). <h3>Apa kita kudu nggabungake kawruh kita? Ing ngisor iki ana rong setengah tugas sing bakal mbantu kita:</h3> Nggunakake grup sing ora njupuk (lan njupuk grup, lan kelas karakter, lan sapiturute), nulis ekspresi reguler sing mung njupuk ukuran file sing diformat kanthi bener ing baris. ing ngisor iki:
pola:
string:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
cocog: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
grup:    11111 1111 11111 111    
( Solusi ) Tag pambuka HTML diwiwiti karo <lan diakhiri karo >. Tag panutup HTML diwiwiti kanthi urutan karakter </lan dipungkasi karo karakter >. Jeneng tag ana ing antarane karakter kasebut. Apa sampeyan bisa nulis ekspresi reguler kanggo njupuk mung jeneng ing tag ing ngisor iki? (Sampeyan bisa uga bisa ngatasi masalah iki tanpa nggunakake grup non-captured. Coba ngrampungake rong cara iki! Sepisan karo kelompok lan sapisan tanpa.)
pola:
string:   <p> </span> <div> </kbd> <link> 
cocog: ^^^ ^^^^^^ ^^^^^ ^^^^^^ ^^^^^^ 
grup:    1 1111 111 111 1111    
( Solusi nggunakake grup non-capturing ) ( Solusi tanpa nggunakake grup non-capturing ) <h2>Langkah 17: Backlinks \Nlan dijenengi grup njupuk</h2> RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 4 - 3Senajan aku ngelingake sampeyan ing introduksi sing nyoba nggawe parser HTML nggunakake ekspresi reguler biasane ndadékaké kanggo heartache, conto pungkasan iki segue becik menyang liyane (kadhangkala) fitur migunani paling ungkapan biasa: backreferences. Backlinks kaya klompok mbaleni ing ngendi sampeyan bisa nyoba njupuk teks sing padha kaping pindho. Nanging padha beda-beda ing siji aspek penting - padha mung dijupuk teks padha, karakter dening karakter. Nalika klompok mbaleni bakal ngidini kita njupuk kaya iki:
pola: (he(?:[az])+) 
string:   heyabcdefg hey heyo heyellow heyyyyyyyyy 
cocog: ^^^^^^^^^^ ^^^ ^^^^ ^^^^^^^^ ^^^ ^^^^^^^^ 
klompok:    1111111111 111 1111 11111111 11111111111    
( Conto ) ...banjur backlink bakal cocog mung iki:
pola: (he([az])(\2+)) 
string: heyabcdefg hey heyo heye heyyyyyyyyy 
cocog:                              ^^^^^^^^^^^ 
grup:                                 11233333333    
( Conto ) Grup panangkepan sing bola-bali migunani yen sampeyan pengin cocog pola sing padha bola-bali, dene backlink apik yen sampeyan pengin cocog karo teks sing padha. Contone, kita bisa nggunakake backlink kanggo nyoba nemokake tag HTML mbukak lan nutup sing cocog:
pola: <(\w+)[^>]*>[^<]+<\/\1> 
string:   <span style="color: red">hey</span> 
cocog: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
kelompok:    1111    
( Conto ) <mark> Wigati dicathet</ mark> yen iki minangka conto sing gampang banget lan aku banget nyaranake sampeyan ora nyoba nulis parser HTML adhedhasar ekspresi biasa. Iki minangka sintaks sing rumit banget lan bakal nyebabake sampeyan lara. Grup panangkepan sing dijenengi meh padha karo backlink, mula aku bakal nutupi kanthi ringkes ing kene. Bentenipun mung antarane backreferences lan grup jupuk jenenge yaiku ... klompok jupuk sing jenenge duwe jeneng:
pola: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
string:   <span style="color: red">hey< /span> 
cocog: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
kelompok:    1111    
( Conto ) Sampeyan bisa nggawe grup njupuk jeneng nggunakake sintaks (?<name>...) utawa (?'name'...) (.NET-compatible regular expression) utawa nganggo sintaks iki (?P<name>. ..) utawa (?P'name'...) (Python-compatible regular expression). Amarga kita nggunakake PCRE (Perl Compatible Regular Expression) sing ndhukung loro versi, kita bisa nggunakake salah siji ing kene. (Jawa 7 nyalin sintaks .NET, nanging mung versi kurung sudut. Cathetan penerjemah) Kanggo mbaleni klompok njupuk jeneng mengko ing ekspresi biasa, kita nggunakake \<kname> utawa \k'name' (.NET) utawa (? P = jeneng) (Python). Maneh, PCRE ndhukung kabeh opsi sing beda-beda iki. Sampeyan bisa maca liyane babagan dijenengi kelompok panangkepan kene , nanging iki sing paling sampeyan kudu ngerti bab wong-wong mau. <h3>Tugas kanggo mbantu kita:</h3> Gunakake backlink kanggo mbantu aku ngelingi... ummm... jenenge wong iki.
pola:
string: "Halo jenengku Joe." [mengko] "Sapa jenenge wong lanang iku? Joe ?"
cocog:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ 
klompok:                  111    
( Solusi ) <h2>Langkah 18: katon ing ngarep lan katon ing mburi</h2> RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 4 - 4Saiki kita bakal nyilem sawetara fitur canggih saka ekspresi reguler. Aku nggunakake kabeh nganti langkah 16 cukup asring. Nanging sawetara langkah pungkasan iki mung kanggo wong sing nggunakake regex kanthi serius kanggo cocog karo ekspresi sing rumit. Ing tembung liyane, master ekspresi reguler. "Looking Forward" lan "Looking Back" bisa uga katon rumit, nanging pancen ora rumit. Dheweke ngidini sampeyan nindakake sing padha karo apa sing ditindakake karo klompok sing ora njupuk sadurunge - priksa manawa ana teks sadurunge utawa langsung sawise teks nyata sing pengin dicocogake. Contone, umpamane, kita mung pengin cocog jeneng barang sing disenengi wong, nanging mung yen dheweke seneng banget (mung yen diakhiri ukara nganggo tanda seru). Kita bisa nindakake kaya:
pola: (\w+)(?=!) 
string: Aku mejo. Aku appreciate stapler. Aku seneng lampu !
cocog:                                           ^^^^ 
klompok:                                              1111    
( Conto ) Sampeyan bisa ndeleng kepiye klompok panangkepan ing ndhuwur (\w+), sing biasane cocog karo salah sawijining tembung ing wacana kasebut, mung cocog karo tembung lampu. Positif dipikir ing ngarep (?=!)tegese kita mung bisa cocog urutan sing pungkasan !nanging kita ora bener cocog karakter tandha seru dhewe. Iki minangka prabédan penting amarga karo klompok non-captured kita cocog karakter nanging ora dijupuk. Kanthi lookaheads lan lookaheads, kita nggunakake karakter kanggo mbangun expression biasa kita, nanging banjur kita ora malah cocog karo dhewe. Kita bisa cocog mengko ing expression biasa kita. Ana patang jinis katon ngarep lan katon mburi: positif katon ngarep (?=...), negatif lookahead (?!...), positif lookahead (?<=...) lan negatif lookahead (?<!. ..) . Padha nindakake apa padha muni - positif lookahead lan lookahead ngidini engine expression biasa terus cocog mung nalika teks sing ana ing lookahead / lookahead bener cocog. Negatif lookahead lan lookahead nindakake ngelawan - padha ngidini regex kanggo cocog mung nalika teks sing ana ing lookahead/lookbehind ora cocog. Contone, kita pengin cocog jeneng cara mung ing chain saka urutan cara, ora obyek padha operate ing. Ing kasus iki, saben jeneng metode kudu didhisiki dening .. Ekspresi reguler nggunakake tampilan bali sing prasaja bisa mbantu ing kene:
pola: (?<=\.)(\w+) 
string: myArray. flatMap.aggregate.summarise.print !
cocog:         ^^^^^^^ ^^^^^^^^^ ^^^^^^^^^ ^^^^^ 
kelompok:            1111111 111111111 111111111 11111    
( Conto ) Ing teks ing ndhuwur, kita cocog karo urutan karakter tembung \w+, nanging mung yen didhisiki dening karakter .. Kita bisa entuk sing padha nggunakake grup non-captured, nanging asile rada messier:
pola: (?:\.)(\w+) 
string: myArray .flatMap.aggregate.summarise.print !
cocog:        ^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^ ^^^^^ 
kelompok:            1111111 111111111 111111111 11111    
( Tuladha ) Sanajan luwih cendhek, nanging cocog karo karakter sing ora dibutuhake. Sanajan conto iki katon ora pati penting, tampilan lan tampilan mburi bisa mbantu ngresiki ekspresi reguler. <h3>Ana sawetara sing isih nganti rampung! 2 tugas ing ngisor iki bakal nggawa kita 1 langkah luwih cedhak:</h3> Negative lookbehind (?<!...) ngidini mesin ekspresi reguler terus nyoba golek sing cocog mung yen teks sing ana ing njero katon negatif ora. ditampilake nganti teks liyane, sing sampeyan kudu golek sing cocog. Contone, kita bisa nggunakake ekspresi biasa kanggo cocog mung jeneng mburi wanita nekani konferensi. Kanggo nindakake iki, kita pengin nggawe manawa jeneng mburi wong ora didhisiki dening Mr.. Apa sampeyan bisa nulis ekspresi reguler kanggo iki? (Jeneng mburi bisa dianggep paling sethithik patang karakter.)
pola:
string: Bp. Brown, Ms. Smith , Ny. Jones , Miss Daisy , Mr. Ijo
cocog:                ^^^^^ ^^^^^ ^^^^^ 
klompok:                   11111 11111 11111    
( Solusi ) Ayo kita ngresiki database lan kita duwe kolom informasi sing nuduhake persentase. Sayange, sawetara wong nulis angka minangka nilai desimal ing kisaran [0.0, 1.0], dene liyane nulis persentase ing kisaran [0.0%, 100.0%], lan liyane nulis angka persentase, nanging lali tandha persen literal %. Nggunakake lookahead negatif (?!...), apa sampeyan bisa menehi tandha mung nilai sing kudu dadi persentase nanging ora ana digit %? Iki kudu dadi nilai sing luwih gedhe tinimbang 1.00, nanging tanpa mburine %. (Ora ana angka sing bisa ngemot luwih saka rong digit sadurunge utawa sawise titik desimal.) <mark>Elinga</mark> yen solusi iki angel banget . Yen sampeyan bisa ngatasi masalah iki tanpa ndeleng jawabanku, mula sampeyan wis duwe katrampilan gedhe babagan ekspresi biasa!
pola:
senar: 0,32 100,00 5,6 0,27 98% 12,2% 1,01 0,99% 0,99 13,13 1,10 
cocog: 
^^^^^^         1,10      cocog :    
( Solusi ) <h2>Langkah 19: Kahanan ing Ekspresi Reguler</h2> RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 4 - 5Saiki kita wis tekan titik ing ngendi akeh wong ora bakal nggunakake ekspresi reguler maneh. Kita wis nutupi mbokmenawa 95% kasus panggunaan kanggo ekspresi reguler sing prasaja, lan kabeh sing ditindakake ing langkah 19 lan 20 biasane ditindakake kanthi basa manipulasi teks sing luwih lengkap kaya awk utawa sed (utawa basa pamrograman umum). Dadi, ayo nerusake, supaya sampeyan ngerti apa sing bisa ditindakake kanthi ekspresi biasa. Sanajan ekspresi reguler ora lengkap Turing , sawetara mesin ekspresi reguler nawakake fitur sing meh padha karo basa pamrograman lengkap. Salah sawijining fitur kasebut yaiku "kondisi". Kondhisi regex ngidini pernyataan yen-banjur-liyane, ing ngendi cabang sing dipilih ditemtokake dening salah siji "look forward" utawa "look back" sing kita sinau babagan ing langkah sadurunge. Contone, sampeyan bisa uga pengin cocog mung entri sing bener ing dhaptar tanggal:
pola: (?<=Feb )([1-2][0-9])|(?<=Mar )([1-2][0-9]|3[0-1]) 
string: Tanggal kerja : Feb 28 , Feb 29 , Feb 30 , Mar 30 , Mar 31  
cocog:                   ^^ ^^ ^^ ^^ 
grup:                      11 11 22 22    
( Conto ) <mark>Elinga</mark> menawa grup ing ndhuwur uga diindeks miturut sasi. Kita bisa nulis ekspresi reguler kanggo kabeh 12 sasi lan njupuk mung tanggal bener, kang banjur bakal digabungake menyang grup sing diindeks dening sasi ing taun. Ndhuwur nggunakake struktur yen-kaya sing mung bakal nggoleki pertandhingan ing grup pisanan yen "Feb" ndhisiki nomer (lan uga kanggo nomer loro). Nanging apa yen kita mung pengin nggunakake pangolahan khusus kanggo Februari? Soko kaya "yen nomer didhisiki "Feb", nindakake iki, utawa nindakake iki liyane. Mangkene carane syarat nindakake:
pola: (?(?<=Feb )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
string: Tanggal kerja: 28 Feb , Feb 29 , Feb 30, Mar 30 , Mar 31  
cocog:                   ^^ ^^ ^^ ^^ 
grup:                      11 11 22 22    
( Tuladha ) Struktur if-then-else katon kaya (?(Yen)then|else), endi (yen) diganti karo "look forward" utawa "look back". Ing conto ing ndhuwur, (yen) ditulis minangka (?<=Feb). Sampeyan bisa ndeleng sing kita cocog tanggal luwih saka 29, nanging mung yen padha ora tindakake "Feb". Nggunakake lookbehinds ing ekspresi kondisional migunani yen sampeyan pengin mesthekake yen pertandhingan kasebut didhisiki dening sawetara teks. Kondisi katon positif bisa mbingungake amarga kondisi kasebut ora cocog karo teks apa wae. Dadi yen sampeyan pengin kondisi yen duwe nilai, mesthine bisa dibandhingake karo katon kaya ing ngisor iki:
pola: (?(?=persis)persis|liya)wo 
string: persis liya persiswo liyane  
cocog:            ^^^^^^^ ^^^^^^
( Conto ) Iki tegese syarat katon positif ora ana gunane. Priksa manawa teks kasebut ana ing ngarep banjur menehi pola sing cocog kanggo tindakake nalika ana. Ekspresi kondisional ora mbantu kita ing kene. Sampeyan uga bisa ngganti ing ndhuwur kanthi ekspresi reguler sing luwih prasaja:
pola: (?:persis|liya)wo 
string: persis liya persiswo liyane  
cocog:            ^^^^^^^ ^^^^^^
( Tuladha ) Dadi, paugeran kanggo ekspresi kondisional yaiku: test, test, lan test maneh. Yen ora, solusi sing sampeyan pikir wis jelas bakal gagal kanthi cara sing paling nyenengake lan ora dikarepke :) <h3>Ing kene kita teka ing blok tugas pungkasan sing misahake kita saka langkah pungkasan, 20:</h3> Tulis ekspresi biasa sing nggunakake ekspresi kondisional lookahead negatif kanggo nguji apa tembung sabanjure diwiwiti kanthi huruf kapital. Yen mangkono, jupuk mung siji huruf kapital banjur huruf cilik. Yen ora, jupuk karakter tembung.
pola:
string:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
cocog: ^^^^^ ^^^^^ ^^^^^ ^^^^^^ ^^^^^^^^^ ^^^ ^^^ 
grup:    22222 22222 11111 222222 111111111 222 111    
( Solusi ) Tulis tampilan negatif ing mburi ekspresi kondisional sing njupuk teks ownsmung yen ora didhisiki teks cl, lan njupuk teks oudsmung yen didhisiki teks cl. (Conto cilik sing digawe, nanging apa sampeyan bisa nindakake ...)
pola:
string: Sing badut duwe sawetara cl ouds . ouds.
cocog:              ^^^^ ^^^^   
( Solusi ) <h2>Langkah 20: Rekursi lan Sinau Luwih</h2> RegEx: 20 langkah singkat kanggo nguwasani ekspresi reguler.  Bagean 4 - 6Nyatane, ana akeh sing bisa ditrapake dadi introduksi 20-langkah kanggo topik apa wae, lan ekspresi reguler ora terkecuali. Ana macem-macem implementasi lan standar kanggo ekspresi reguler sing bisa ditemokake ing Internet. Yen sampeyan pengin sinau luwih akeh, aku saranake sampeyan mriksa situs sing apik banget regularexpressions.info , minangka referensi sing apik banget lan aku mesthi sinau akeh babagan ekspresi reguler saka kono. Aku banget nyaranake, uga regex101.com kanggo nyoba lan nerbitake kreasi sampeyan. Ing langkah pungkasan iki, aku bakal menehi kawruh liyane babagan ekspresi reguler, yaiku carane nulis ekspresi rekursif. Rekursi prasaja cukup prasaja, nanging ayo dipikirake apa tegese ing konteks ekspresi reguler. Sintaks kanggo rekursi prasaja ing ekspresi reguler ditulis kaya mangkene: (?R)?. Nanging, mesthi, sintaks iki kudu katon ing ekspresi kasebut. Sing bakal ditindakake yaiku nest ekspresi kasebut ing awake dhewe, kaping pirang-pirang. Tuladhane:
pola: (hey(?R)?oh) 
string:   heyoh heyyoh heyheyohoh hey heyhey hey heyheyohoh  
cocog: ^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^ 
grup:    11111 1111111111 1111111111    
( Conto ) Amarga ekspresi nested opsional ( (?R)diterusake ?), sing paling gampang yaiku nglirwakake rekursi kanthi lengkap. Dadi, hey, banjur ohcocog ( heyoh). Kanggo cocog karo ekspresi sing luwih rumit tinimbang iki, kita kudu nemokake manawa substring sing cocog dipasang ing njero dhewe ing titik ing ekspresi ing ngendi kita nglebokake (?R)urutan kasebut. Kanthi tembung liyane, kita bisa nemokake heyheyohoh utawa heyheyheyohohoh, lan liya-liyane. Salah sawijining perkara sing paling apik babagan ekspresi bersarang iki yaiku, ora kaya referensi mburi lan klompok penangkep sing dijenengi, dheweke ora mbatesi sampeyan menyang teks sing cocog sadurunge, karakter kanthi karakter. Tuladhane:
pola: ([Hh][Ee][Yy](?R)?oh) 
string:   heyoh heyyoh hEyHeYohoh hey hey heyheyheyohohoh  
cocog: ^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^ 
klompok:    11111 1111111111 1111111111111111    
( Conto ) Sampeyan bisa mbayangno yen mesin ekspresi reguler kanthi harfiah nyalin lan nempel ekspresi reguler sampeyan kaping pirang-pirang. Mesthi wae, iki tegese kadhangkala ora bisa nindakake apa sing dikarepake:
pola: ((?:\(\*)[^*)]*(?R)?(?:\*\))) 
string: (* komentar (* nested *) not *)
cocog:            ^^^^^^^^^^^^ 
kelompok:               111111111111    
( Conto ) Apa sampeyan bisa ngerti kenapa regex iki mung njupuk komentar bersarang lan dudu komentar njaba? Siji bab sing mesthi: nalika nulis ekspresi reguler sing rumit, mesthi nyoba kanggo mesthekake yen bisa digunakake kanthi cara sing sampeyan pikirake. Rally kacepetan dhuwur iki ing sadawane dalan ekspresi reguler wis rampung. Muga-muga sampeyan seneng karo perjalanan iki. Inggih, lan pungkasanipun, aku bakal ninggalake kene, kaya sing dakjanjekake ing wiwitan, sawetara tautan sing migunani kanggo sinau materi sing luwih jero:
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION