JavaRush /Java блогы /Random-KK /RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 2-...
Artur
Деңгей
Tallinn

RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 2-бөлім

Топта жарияланған
RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 1-бөлім Түпнұсқа осында Соңғы бөлімде біз қарапайым тұрақты тіркестерді игердік және бірдеңені үйрендік. Бұл бөлімде біз біршама күрделі дизайнды зерттейміз, бірақ маған сеніңіз, бұл көрінгендей қиын болмайды. RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  2 - 1 бөлімЕндеше жалғастырайық!

8-қадам: Жұлдызша *және плюс белгісі+

RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  2 - 2 бөлімӘзірге біз азды-көпті берілген ұзындықтағы жолдарды ғана сәйкестендірдік. Бірақ соңғы мәселелерде біз осы уақытқа дейін көрген белгілермен не істей алатынымыздың шегіне жақындадық. Мысалы, біз 3 таңбалы Java идентификаторларымен шектелмейміз, бірақ бізде кез келген ұзындықтағы идентификаторлар болуы мүмкін делік. Алдыңғы мысалда жұмыс істеген шешім келесі мысалда жұмыс істемейді:
үлгі: [a-zA-Z_$]\w\w 
жол:   __e $12 3 3.2 fo Бар r a23 мм ab x
сәйкес келеді: ^^^ ^^^ ^^^ ^^^  
( Мысалы ) назар аударыңызидентификатор жарамды, бірақ 3 таңбадан ұзақ болса, тек алғашқы үш таңба сәйкес келеді. Ал идентификатор жарамды болса, бірақ 3 таңбадан аз болса, regex оны мүлдем таппайды! Мәселе мынада, жақшаға алынған өрнектер []дәл бір таңбаға сәйкес келеді, мысалы, таңба кластары \w. Бұл жоғарыдағы тұрақты өрнектегі кез келген сәйкестіктер дәл үш таңбадан тұруы керек дегенді білдіреді. Сондықтан бұл біз ойлағандай жақсы жұмыс істемейді. *Арнайы кейіпкерлер мен мұнда көмектесе алады +. Бұл өрнекпен бірнеше рет сәйкестендіру үшін кез келген өрнектің оң жағына қосуға болатын модификаторлар. Kleene жұлдызы (немесе «жұлдызша») *алдыңғы таңбалауышты кез келген рет, соның ішінде нөл ретімен сәйкестендіру керектігін көрсетеді. Плюс белгісі +бір немесе бірнеше рет іздеу керек екенін көрсетеді. Осылайша, алдындағы өрнек +міндетті (кем дегенде бір рет), ал алдындағы өрнек *міндетті емес, бірақ ол пайда болған кезде ол кез келген рет пайда болуы мүмкін. Енді осы білім арқылы біз жоғарыдағы тұрақты өрнекті түзете аламыз:
үлгі: [a-zA-Z_$]\w* 
жол:   __e $123 3,2 Barr a23mm ab x 
сәйкес келеді: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^ 
( Мысал ) Енді біз кез келген ұзындықтағы жарамды идентификаторларды сәйкестендіреміз! Бинго! +Бірақ оның орнына ? қолдансақ не болар еді *?
үлгі: [a-zA-Z_$]\w+ 
жол:   __e Barr a23mm ab x үшін $123 3,2
сәйкес келеді: ^^^ ^^^^ ^^ ^^^^ ^^^^^^ ^^ 
( Мысал ) Біз соңғы матчты жіберіп алдық х. Себебі ол +кем дегенде бір таңбаны сәйкестендіруді талап етеді, бірақ []алдыңғы жақшадағы өрнек \w+таңбаны әлдеқашан «жеп қойған» болғандықтан x, басқа таңбалар қолжетімді емес, сондықтан сәйкестік сәтсіз аяқталады. Қашан пайдалана аламыз +? Бізге кем дегенде бір сәйкестік табу керек болғанда, бірақ берілген өрнек қанша рет сәйкес келетіні маңызды емес. Мысалы, ондық бөлшек бар кез келген сандарды тапқымыз келсе:
үлгі: \d*\.\d+ 
жол:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
сәйкес келеді: ^^^^^ ^^ ^^^ ^^^^ ^^^^^^^^^^^  
( Мысалы ) назар аударыңызондық бөлшектің сол жағындағы сандарды міндетті емес ету арқылы біз 0,011 де, ,2 де таба алдық. \.Мұны істеу үшін бізге дәл бір ондық бөлшекті және ондық бөлшектің оң жағындағы кемінде бір цифрды -мен сәйкестендіру керек болды \d+. Жоғарыдағы тұрақты өрнек сияқты санға сәйкес келмейді 3., өйткені сәйкес болу үшін бізге ондық бөлшектің оң жағында кемінде бір цифр қажет.

Әдеттегідей, бірнеше қарапайым мәселені шешейік:

Төмендегі үзіндідегі барлық ағылшын сөздерін табыңыз.
үлгі:
жол: 3 плюс 3 - алты, бірақ 4 плюс үш - 7
сәйкес келеді:    ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^ 
( Шешім ) Төмендегі тізімнен барлық файл өлшемі таңбаларын табыңыз. Файл өлшемдері саннан (ондық үтірмен немесе онсыз) тұрады, одан кейін KB, MB, GBнемесе TB:
үлгі:
жол:   11TB 13 14,4MB 22HB 9,9GB TB 0KB 
сәйкес келеді: ^^^^ ^^^^^^ ^^^^^ ^^^  
( Шешім )

9-қадам: «қосымша» сұрақ белгісі?

RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  2 - 3 бөлімСоңғы мәселені шешу үшін regex жаздыңыз ба? Бұл жұмыс істеді ме? Енді оны мына жерде қолданып көріңіз:
үлгі:
жол: 1..3KB 5...GB ..6TB
сәйкес келеді:  
Әлбетте, бұл белгілеулердің ешқайсысы жарамды файл өлшемі емес, сондықтан жақсы тұрақты өрнек олардың ешқайсысына сәйкес келмеуі керек. Соңғы мәселені шешу үшін жазған шешім олардың барлығына сәйкес келеді, кем дегенде ішінара:
үлгі: \d+\.*\d*[KMGT]B 
жолы:   1..3КБ  5...ГБ .. 6ТБ 
сәйкес: ^^^^^^ ^^^^^^ ^^^ 
( Мысалы ) Сонымен, мәселе неде? Шындығында, егер бар болса, біз тек бір ондық бөлшекті табуымыз керек. Бірақ *ол нөлді қоса алғанда, кез келген сәйкестік санына мүмкіндік береді. Тек нөл немесе бір рет сәйкестендіру жолы бар ма? Бірақ бір реттен артық емес пе? Әрине бар. "қосымша" ?- нөлге немесе алдыңғы таңбалардың біріне сәйкес келетін модификатор, бірақ артық емес:
үлгі: \d+\.?\d*[KMGT]B 
жолы: 1.. 3КБ 5...ГБ .. 6ТБ 
сәйкес:     ^^^ ^^^ 
( Мысал ) Біз бұл жерде шешімге жақындадық, бірақ бұл бізге қажет нәрсе емес. Мұны қалай түзетуге болатынын біраз уақыттан кейін көреміз.

Осы арада мына мәселені шешейік:

Кейбір бағдарламалау тілдерінде (мысалы, Java) кейбір бүтін және жылжымалы нүкте (нүкте) сандары оларды кәдімгі int/double емес, ұзын/жүзу (тиісінше) ретінде қарастыру керектігін көрсету үшін l/ Lжәне f/ таңбаларымен жалғасуы мүмкін. FТөмендегі жолдағы барлық жарамды «ұзын» сандарды табыңыз:
үлгі:
жол:   13л ұзындығы 2л 19 л lL 0 
сәйкестік: ^^^ ^^ ^^ ^ 
( Шешім )

10-қадам: «немесе» белгісі|

RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  2 - 4 бөлім8-қадамда біз өзгермелі нүкте сандарының әртүрлі түрлерін табуда біраз қиындықтарға тап болдық:
үлгі: \d*\.\d+ 
жол:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
сәйкес келеді: ^^^^^ ^^ ^^^ ^^^^ ^^^^^^^^^^^  
Жоғарыдағы үлгі ондық үтірмен және ондық үтірдің оң жағындағы кемінде бір цифры бар сандарға сәйкес келеді. Бірақ егер біз сондай-ақ сияқты жолдарды сәйкестендіруді қаласақ ше 0.? (Ондық бөлшектің оң жағында сандар жоқ.) Біз келесідей тұрақты өрнек жаза аламыз:
үлгі: \d*\.\d* 
жол:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. . 
сәйкес келеді: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ ^ 
( Мысал ) Бұл сәйкес келеді , бірақ жоғарыда көріп отырғаныңыздай, 0.бір нүктеге де сәйкес келеді . .Іс жүзінде біз сәйкестендіруге тырысатын нәрсе - бұл екі түрлі жол класы:
  1. ондық бөлшектің оң жағында кемінде бір цифры бар сандар
  2. ондық бөлшектің сол жағында кемінде бір цифры бар сандар
Келесі 2 тұрақты сөз тіркесін бір-бірінен тәуелсіз жазайық:
үлгі: \d*\.\d+ 
жол:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
сәйкес келеді: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
үлгі: \d+\.\d* 
жол:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
сәйкес келеді: ^^^^^ ^^^ ^^^^ ^^^^^^^^^^^^^^ 
Бұл жағдайлардың ешқайсысында , немесе ішкі жолдар 42қозғалтқыштан 5табылмайтынын 6көреміз .. Қажетті нәтижеге қол жеткізу үшін осы тұрақты тіркестерді біріктіру бізге зиян тигізбейді. Бұған қалай қол жеткізе аламыз? «немесе» белгісі |тұрақты өрнекте бірден бірнеше ықтимал сәйкестіктер тізбегін көрсетуге мүмкіндік береді. []«немесе» таңбасы балама жалғыз таңбаларды көрсетуге мүмкіндік беретіні сияқты , |баламалы көп таңбалы өрнектерді де көрсете аламыз. Мысалы, егер біз «ит» немесе «мысықты» тапқымыз келсе, келесідей нәрсені жаза аламыз:
үлгі: \w\w\w жолы 
:   Әлбетте , ит мысықтан жақсы үй жануары .
сәйкес келеді: ^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^ 
( Мысал ) ... бірақ бұл "сөз" сыныбының барлық үш таңба тізбегіне сәйкес келеді. Бірақ «ит» пен «мысықтың» ортақ әріптері де жоқ, сондықтан төртбұрышты жақшалар бізге мұнда көмектеспейді. Міне, осы екі сөзге де сәйкес келетін ең қарапайым тұрақты өрнек:
үлгі: ит|мысық 
жіп: Әлбетте, ит мысықтан жақсы үй жануары .
сәйкес келеді:               ^^^ ^^^ 
( Мысал ) Тұрақты өрнек механизмі алдымен таңбаның сол жағындағы бүкіл тізбекті сәйкестендіруге тырысады |, бірақ ол сәтсіз болса, ол таңбаның оң жағындағы ретті сәйкестендіруге тырысады |. Бірнеше таңбаны |екіден көп баламалы реттілікке сәйкестендіру үшін тізбектеуге болады:
үлгі: ит|мысық|үй жануарларының жібі 
: Әлбетте, ит мысықтан жақсы үй жануары .
сәйкес келеді:               ^^^ ^^^ ^^^ 
( Мысалы )

Енді осы қадамды жақсы түсіну үшін тағы бірнеше мәселені шешейік:

|Мынадай нәтиже шығару үшін жоғарыдағы ондық тұрақты өрнекті түзету үшін белгіні пайдаланыңыз :
үлгі:
жол:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
сәйкес келеді: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
( Шешім ) Алдыңғы қадамның соңындағы мәселеде қарастырылғандай, бүтін және жылжымалы нүкте (нүкте) сандарына сәйкес келетін жалғыз тұрақты өрнек жасау үшін белгіні |, таңба кластарын, "міндетті емес" т.б. пайдаланыңыз (бұл мәселе аздап). ?күрделірек, иә;))
үлгі:
жол:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
сәйкес келеді: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^  
( Шешім ) Тұрақты тіркестерді меңгеру үшін 20 қысқа қадам. 3-бөлім RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 4-бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION