Биёед омӯзиши ибораҳои муқаррариро идома диҳем. Дар ин мақола мо синфҳои аломатҳои пешакӣ муайяншуда ва инчунин миқдорро (ҷустуҷӯи пайдарпайҳо) дида мебароем.
Дар ин ҷадвал, конструксияҳои сутуни чап тасвири стенографияи ифодаҳои сутуни рост мебошанд. Масалан, ![Основы регулярных выражений в Java. Часть 3 - 3]()
Дар се мисоли аввал ифодаи муқаррарӣ танҳо "
Миқдорҳо ба шумо имкон медиҳанд, ки шумораи пайдоиши аломатро дар сатр муайян кунед. Биёед, ба нозукихои чи тавр кор кардани микдорхои хасис, танбал ва хеле тамаъкор назар андозем. Дар назари аввал чунин менамояд, ки миќдорњои X?, X?? ва X?+ ҳамин тавр кор мекунанд: "X як бор мавҷуд аст ё тамоман нест." Дар татбиқи ин миқдорҳо фарқиятҳои ночиз мавҷуданд, ки мо дар поён дида мебароем.
Дар мисоли боло ҷустуҷӯ дар ду ҳолати аввал муваффақ буд, зеро ибораҳои а? ва а* имкон медихад, ки аломати а дар сатр гум шавад. Инчунин қайд кунед, ки шохиси бозии оғоз ва охирин якхела аст (0). Азбаски сатри вуруд дарозӣ надорад, барнома дар мавқеи аввал чизе намеёбад :). Ин ҳолат бозии сифрӣ номида мешавад. Чунин мувофиқатҳо дар чанд маврид рух медиҳанд: вақте ки хати вуруд холӣ аст, дар аввали сатри воридот, пас аз аломати охирини сатр ё байни аломатҳои сатр. Гугирдҳои дарозии сифрро муайян кардан осон аст: онҳо дар як мавқеъ оғоз ва анҷом меёбанд. Биёед ба якчанд мисолҳои бозиҳои сифр-дарозии бештар нигаред. Биёед бо чанд мисоли дигар мувофиқатҳои дарозии сифрро омӯзем. Биёед сатри вурудро ба аломати "а" иваз кунем ва таъсири ҷолибро мушоҳида кунем:
Ҳар се миқдор аломати "а"-ро ёфтанд, аммо дуи аввал, ки набудани аломатро имкон медиҳанд, дар мавқеи 1 мувофиқати сифрӣ пайдо карданд. - пас аз аломати охирини сатр. Ин аз он сабаб рӯй медиҳад, ки барнома аломати "a"-ро ҳамчун сатр баррасӣ мекунад ва то он даме, ки дигар мувофиқатҳо мавҷуд набошанд, тавассути он "мегузаранд". Вобаста аз миқдори истифодашаванда, барнома дар охири сатр "ҳеҷ чиз"-ро намеёбад ё намеёбад. Акнун биёед сатри вурудро ба пайдарпаии панҷ ҳарфи "а" иваз кунем:
Ифодаи муқаррарии a? ба хар як харфи сатр алохида мувофикат мекунад. Ифодаи a* ду мувофиқатро пайдо мекунад: пайдарпаии аломатҳои "a"' ва мувофиқати сифрӣ дар мавқеи 5. Ва ниҳоят, ифодаи муқаррарии a+ танҳо пайдарпаии аломатҳои “а”-ро бидуни дарёфти “ҳеҷ чиз” пайдо мекунад :) Агар сатри дорои аломатҳои гуногун ҳамчун вуруд дода шавад, чӣ мешавад? Масалан, "ababaaaab":
Аломати "b" дар мавқеъҳои 1, 3 ва 8 ҷойгир аст ва барнома дар ин мавқеъ мувофиқатҳои дарозии сифрро пайдо мекунад. Ифодаи муқаррарӣ а? ба «б» эътибор намедиҳад, балки фақат мавҷудияти (ё набудани) аломати «а»-ро меҷӯяд. Агар миқдоркунанда мавҷуд набудани "a" иҷоза диҳад, ҳама аломатҳои сатр ғайр аз "a" ҳамчун мувофиқати дарозии сифр нишон дода мешаванд. Барои пайдо кардани пайдарпайии дарозии додашуда, танҳо дарозиро дар қавсҳои ҷингила муайян кунед:
Ифодаи муқаррарии a{3} пайдарпайии се аломати "а"-ро ҷустуҷӯ мекунад. Дар сатри аввал чизе ёфт нашуд, зеро дар сатр а кофй набуд. Дуюм 3 аломатро дар бар мегирад, ки барнома онҳоро пайдо мекунад. Санҷиши сеюм низ дар оғози сатр мувофиқат пайдо мекунад. Ҳама чиз пас аз аломати 3-юм ифодаи муқаррариро қонеъ намекунад, дар codeи зер ин мувофиқат мекунад ва якчанд мувофиқат вуҷуд дорад:
Барои муайян кардани дарозии ҳадди ақали пайдарпай, истифода баред:
Дар ин мисол, бозии аввал дар аломати шашум анҷом ёфт. Дар бозии дуюм дорои аломатҳои пас аз як шашум, зеро онхо талаботи минималии дарозиро конеъ мегардонанд. Агар сатр як аломат кӯтоҳтар мебуд, мувофиқати дуюм вуҷуд надошт.
Дар мисоли аввал, барнома мувофиқатро пайдо мекунад, зеро миқдор ба як гурӯҳи аломатҳо паҳн мешавад. Агар шумо қавсҳоро хориҷ кунед, миқдори муайянкунандаи {3} танҳо ба ҳарфи "g" татбиқ мешавад. Шумо инчунин метавонед миқдоркунакҳоро бо синфҳои аломат истифода баред:
Миқдори {3} ба синфи аломатҳои дар қавс дар мисоли якум ва дар дуюм - танҳо ба аломати "c" дахл дорад.
Мисоли аввал миқдорбандии чашмгурусна .*-ро барои дарёфти ҳар гуна аломат, 0 ё бештар аз он истифода мебарад ва пас аз он аломатҳои "f" "o" "o" истифода мешаванд. Азбаски cantifier хасис аст, гӯгирд ёфтшуда тамоми сатрро дар бар мегирад. Миқдори хасис на ҳама мувофиқатҳоро дар сатр пайдо мекунад, зеро дар қадами аввал, пас аз скан кардани тамоми сатр, он мувофиқат пайдо мекунад ва корро анҷом медиҳад. Мисоли дуюм танбал аст ва аз аввали сатр оғоз мешавад ва аломат ба ҳарф илова мекунад. Барнома бо тафтиши "холӣ" оғоз меёбад, аммо аз он вақт пайдарпаии "foo" дар аввали сатр нест, ҷустуҷӯ бо иловаи аломати "х" идома меёбад, ки пас аз он мувофиқати аввал байни индексҳои 0 ва 4 пайдо мешавад. Ҷустуҷӯ то охири сатр идома меёбад. ва мувофиқати дуюм дар байни шохиси 4 ва 13 пайдо мешавад. Мисоли сеюм тасодуфҳоро намеёбад, зеро миқдор ҳасад аст. Дар ин ҳолат, ифодаи муқаррарии .*+ тамоми сатрро "хӯрд" ва барои "foo" чизе намегузорад. Вақте ки шумо бояд ягон чизи нолозимро дар сатр партофтан лозим аст, миқдори ҳасадро истифода баред, он нисбат ба миқдори муодor хасис самараноктар хоҳад буд. Ҳамааш ҳамин! Пайванд ба манбаъ: Асосҳои ифодаҳои муқаррарӣ дар Java. Қисми 3
Синфҳои аломатҳои пешакӣ муайяншуда
Синфи APIPattern
дорои синфҳои аломатҳои пешакӣ муайяншуда мебошад, ки миёнабурҳои мувофиқро барои ифодаҳои муқаррарии маъмулан истифодашаванда пешниҳод мекунанд. \d
маънои рақам (0-9), \w
маънои ҳама гуна ҳарфи калон ё хурд, зерхат ё рақамро дорад. То ҳадди имкон синфҳои аломатҳои пешакӣ муайяншударо истифода баред. Ин codeи шуморо хондан ва ислоҳи хатогиҳоро осон мекунад. Конструксияҳое, ки бо хатти баръакс оғоз мешаванд, escaped ё муҳофизатшуда номида мешаванд. Дар мақолаҳои қаблӣ, мо аллакай дар бораи гурехтани аломатҳои махсус бо хатҳои баръакс ё рамзҳо \Q
ва \E
истифодаи онҳо ҳамчун аломатҳои муқаррарӣ сӯҳбат карда будем. Агар шумо хатти ақибро бо аломатҳои муқаррарӣ истифода баред (ҳарфҳо), пас барои тартиб додани ифода ба шумо лозим аст, ки аз хатти баръакс гурезед.
private final String REGEX = "\\d"; // цифра
Дар ин мисол \d
ифодаи муқаррарӣ; барои тартиб додани барнома хати хати иловагӣ лозим аст. Барномаи санҷишии мо ифодаҳои муқаррариро мустақиман аз консол мехонад, аз ин рӯ ҳеҷ гуна рахи иловагӣ лозим нест. Мисоли зерин истифодаи синфҳои аломатҳои пешакӣ муайяншударо нишон медиҳад: ![Основы регулярных выражений в Java. Часть 3 - 3](https://cdn.javarush.com/images/article/1b01383c-1811-4648-8923-b6987db5e19d/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 4](https://cdn.javarush.com/images/article/4e1c1668-4406-4488-a2ab-17d0111c8aa6/1024.jpeg)
.
" (аломати махсуси нуқта) аст, ки маънои ҳар гуна аломатро дорад. Аз ин ру, чустучу дар хамаи мавридхо бомуваффакият гузашт. Мисолҳои дигар синфҳои аломатҳои пешакӣ муайяншударо истифода мебаранд, ки маънои онҳоро мо дар ҷадвали боло баррасӣ кардем.
Миқдорҳо
![Основы регулярных выражений в Java. Часть 3 - 4](https://cdn.javarush.com/images/article/46bbc180-b0c7-4fd2-964a-d74319f7838b/1024.jpeg)
Дарозии сифр мувофиқат мекунад
Биёед, аз хасис оғоз кунем. Биёед се ибораи муқаррарии гуногунро нависед: ҳарфи «а» бо аломатҳои махсус ?, * ё +. Биёед бубинем, ки агар ин ибораҳои муқаррариро дар сатри холӣ санҷем, чӣ мешавад:![Основы регулярных выражений в Java. Часть 3 - 5](https://cdn.javarush.com/images/article/2222afd9-7255-43ef-9c29-5ebfbc56aab9/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 6](https://cdn.javarush.com/images/article/e1c808a7-5a1c-48a1-ada5-8e7398ce7711/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 7](https://cdn.javarush.com/images/article/01af5247-7fa0-429a-b3ea-5a5a15ef1f7f/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 8](https://cdn.javarush.com/images/article/015a8b48-4d89-4af1-987e-2a7cab1b62d3/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 9](https://cdn.javarush.com/images/article/c871b787-760d-4a53-b3bd-6b04d4afd41e/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 10](https://cdn.javarush.com/images/article/aac87994-bca7-414d-a7c1-aadf017c1281/1024.jpeg)
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Дар ин мисол, барнома танҳо як мувофиқатро пайдо мекунад, зеро сатр ба талаботи ҳадди ақали дарозии пайдарпайии (3) аломатҳои "a" мувофиқат мекунад. Ниҳоят, муқаррар кардани дарозии максималии пайдарпай: ![Основы регулярных выражений в Java. Часть 3 - 11](https://cdn.javarush.com/images/article/722ccf78-ee60-42b3-aae6-373aa310cc19/1024.jpeg)
Истифодаи гурӯҳҳо ва синфҳои аломатҳо бо миқдорҳо
То ин вақт, мо миқдорҳоро дар сатрҳои дорои як аломат санҷидаем. Миқдорҳо танҳо ба як аломат истифода мешаванд, аз ин рӯ ифодаи муқаррарии "abc+" ба сатрҳои дорои "ab" ва "c" як ё якчанд маротиба мувофиқат мекунад. Он як ё якчанд маротиба маънои "abc" нахоҳад буд. Аммо миқдорҳо метавонанд дар якҷоягӣ бо гурӯҳҳо ва синфҳои аломатҳо истифода шаванд, ба монанди [abc]+ (a ё b ё c, як ё якчанд маротиба) ё (abc)+ (“abc” як ё якчанд маротиба). Биёед як гурӯҳи аломатҳоро (саг), се маротиба дар як сатр пайдо кунем:![Основы регулярных выражений в Java. Часть 3 - 12](https://cdn.javarush.com/images/article/0414bbda-dd55-4ac1-af29-9dcf53b20c05/1024.jpeg)
![Основы регулярных выражений в Java. Часть 3 - 13](https://cdn.javarush.com/images/article/8477b7f2-fdd5-4f23-9890-f2015a6ba011/1024.jpeg)
Тафовут байни миқдорҳои хасис, танбал ва аз ҳад зиёд хасис
Байни миқдорҳои тамаъкор, нохоҳам ва соҳибӣ фарқиятҳои ночиз мавҷуданд. Миқдорҳои тамаъкор аз он сабаб номгузорӣ шудаанд, ки онҳо кӯшиш мекунанд, ки мувофиқати дарозтаринро пайдо кунанд: барнома аввал кӯшиш мекунад, ки тамоми сатрро "хӯрад", агар мувофиқат пайдо нашавад, як аломат партофта мешавад ва ҷустуҷӯ то пайдо шудани мувофиқат такрор мешавад ё дигар характер намемонад. Танбалхо бошанд, аз аввали сатр сар карда, ба паси характер характер илова мекунанд, то он даме, ки мувофикат пайдо кунад. Ниҳоят, миқдори ҳасад тамоми сатрро як маротиба, бидуни нест кардани аломатҳо, ба монанди чашмгуруснагӣ скан мекунад. Барои намоиш, мо сатри xfooxxxxxxfoo-ро истифода мебарем.![Основы регулярных выражений в Java. Часть 3 - 14](https://cdn.javarush.com/images/article/dab5f212-bec3-4246-bee7-d969dcb04894/1024.jpeg)
GO TO FULL VERSION