JavaRush /Блоги Java /Random-TG /RegEx: 20 қадами кӯтоҳ барои азхудкунии ибораҳои муқаррар...
Artur
Сатҳи
Tallinn

RegEx: 20 қадами кӯтоҳ барои азхудкунии ибораҳои муқаррарӣ. Қисми 2

Дар гурӯҳ нашр шудааст
RegEx: 20 қадами кӯтоҳ барои азхудкунии ибораҳои муқаррарӣ. Қисми 1 Асли ин ҷо Дар қисми охир мо соддатарин ибораҳои муқаррариро азхуд кардем ва аллакай чизеро омӯхтем. Дар ин бахш мо тарҳҳои каме мураккабтарро меомӯзем, аммо ба ман бовар кунед, он қадар душвор нахоҳад буд, ки ба назар мерасад. RegEx: 20 қадами кӯтоҳ барои азхудкунии ибораҳои муқаррарӣ.  Қисми 2 - 1Пас биёед идома диҳем!

Қадами 8: *Аломати ситора ва плюс+

RegEx: 20 қадами кӯтоҳ барои азхудкунии ибораҳои муқаррарӣ.  Қисми 2 - 2То ба ҳол, мо тавонистем танҳо бо сатрҳои дарозии додашуда мувофиқат кунем. Аммо дар мушкилоти охирин мо ба маҳдудияти он чизе, ки мо бо нишонаҳое, ки то имрӯз дидаем, карда метавонем, наздик шудем. Масалан, фарз кунем, ки мо бо идентификаторҳои Java-и 3-ҳарфа маҳдуд нестем, балки мо метавонем идентификаторҳои дарозии дилхоҳ дошта бошем. Ҳалли, ки дар мисоли қаблӣ кор мекард, дар мисоли зерин кор намекунад:
намуна: [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 $123 3.2 барои Barr a23mm ab x
Мувофиқат: ^^^ ^^^ ^^ ^ ^ ^^ ^^ 
( Мисол ) Мо бозии охиринро аз даст додем, х. Сабаб дар он аст, ки +барои мувофиқ кардани ҳадди ақал як аломат лозим аст, аммо азбаски ифодаи дар қавс гирифташуда []аллакай \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..3KB  5...GB .. 6TB 
мувофиқат: ^^^^^^ ^^^^^^ ^^^ 
( Мисол ) Пас мушкил дар чист? Дар асл, мо бояд танҳо як нуқтаи даҳиро пайдо кунем, агар он вуҷуд дошта бошад. Аммо *он имкон медиҳад, ки ягон шумораи мувофиқат, аз ҷумла сифр. Оё роҳи мувофиқ кардани танҳо сифр ё як вақт вуҷуд дорад? Аммо на бештар аз як маротиба? Албатта доранд. "ихтиёрӣ" ?тағирдиҳандаест, ки ба сифр ё яке аз аломатҳои қаблӣ мувофиқат мекунад, аммо на бештар:
намуна: \d+\.?\d*[KMGT]B 
сатри: 1.. 3KB 5...GB .. 6TB 
мувофиқат:     ^^^ ^^^ 
( Мисол ) Мо дар ин ҷо ба ҳалли наздиктарем, аммо ин он чизест, ки ба мо лозим нест. Мо хоҳем дид, ки чӣ тавр инро дар чанд қадам пас аз чанде ислоҳ кунем.

Дар ҳамин ҳол, биёед ин масъаларо ҳал кунем:

Дар баъзе забонҳои барномасозӣ (масалан, Java), баъзе рақамҳои бутун ва нуқтаи шинокунанда (нуқта) метавонанд бо l/ Lва f/ пайравӣ карда шаванд F, то нишон диҳад, ки онҳо бояд ҳамчун дароз / шино (мутаносибан) баррасӣ карда шаванд, на ҳамчун int/double. Ҳама рақамҳои дурусти "дароз"-ро дар сатри зер пайдо кунед:
намуна:
сатр:   13L дароз 2l 19 L 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