JavaRush /Блоги Java /Random-TG /Ифодаҳои муқаррарӣ дар Java (RegEx)

Ифодаҳои муқаррарӣ дар Java (RegEx)

Дар гурӯҳ нашр шудааст
Ибораҳои муқаррарӣ мавзӯъест, ки барномасозон, ҳатто шахсони ботаҷриба, аксар вақт то дертар гузошта мешаванд. Бо вуҷуди ин, аксари таҳиягарони Java дер ё зуд бояд бо коркарди матн сарукор дошта бошанд. Аксар вақт - бо амалиёти ҷустуҷӯ дар матн ва таҳрир. Бе ибораҳои муқаррарӣ, codeи барномаи пурмаҳсул ва паймоне, ки бо коркарди матн алоқаманд аст, ғайриимкон аст. Пас, аз он даст кашед, биёед ҳоло бо "муқаррарӣ" сарукор кунем. Ин кори душвор нест.

Ифодаи муқаррарии RegEx чист?

Дар асл, ифодаи муқаррарӣ (RegEx дар Java) намунаи ҷустуҷӯи сатр дар матн аст. Дар Java тасвири ибтидоии ин намуна ҳамеша сатр, яъне an objectи синфи String мебошад. Аммо, ягон сатрро ба ифодаи муқаррарӣ ҷамъ овардан мумкин нест, танҳо онҳое, ки қоидаҳои навиштани ифодаи муқаррариро риоя мекунанд - синтаксиси дар мушаххасоти забон муайяншуда. Барои навиштани ибораи муқаррарӣ аломатҳои алифбоӣ ва ададӣ, инчунин метаҳарфаҳо – аломатҳое истифода мешаванд, ки дар синтаксиси ибораҳои муқаррарӣ маънои махсус доранд. Барои намуна:
String regex = "java"; // string template "java";
String regex = "\\d{3}"; // string template of three numeric characters;

Эҷоди ифодаҳои муқаррарӣ дар Java

Барои сохтани RegEx дар Java, шумо бояд ду қадами оддиро иҷро кунед:
  1. онро ҳамчун сатр бо истифода аз синтаксиси ифодаи муқаррарӣ нависед;
  2. ин сатрро ба ифодаи муқаррарӣ тартиб диҳед;
Кор бо ифодаҳои муқаррарӣ дар ҳама гуна барномаи Java аз сохтани an objectи синф оғоз мешавад Pattern. Барои ин ба шумо лозим аст, ки яке аз ду усули статикиро, ки дар синф мавҷуд аст, даъват кунед compile. Усули аввал як аргумент мегирад - як сатри литерали ифодаи муқаррарӣ ва дуюм - иловаи параметри дигаре, ки режими муқоисаи қолабро бо матн фаъол мекунад:
public static Pattern compile (String literal)
public static Pattern compile (String literal, int flags)
Рӯйхати арзишҳои имконпазири параметр flagsдар синф муайян карда шудааст Patternва барои мо ҳамчун тағирёбандаҳои синфи статикӣ дастрас аст. Барои намуна:
Pattern pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//searching for matches with the pattern will be done case-insensitively.
Аслан, синф Patternяк созандаи ифодаи муқаррарӣ мебошад. Дар зери сарпӯш, метод compileконструктори хусусии синфро даъват мекунад Pattern, то намуди тартибдодашударо эҷод кунад. Ин усули эҷоди намунаи қолабӣ бо мақсади эҷоди он ҳамчун an objectи тағирнопазир амалӣ карда мешавад. Ҳангоми эҷод, санҷиши синтаксиси ифодаи муқаррарӣ анҷом дода мешавад. Агар дар сатр хатогӣ мавҷуд бошад, истисно тавлид мешавад PatternSyntaxException.

Синтаксиси ифодаи муқаррарӣ

Синтаксиси ифодаи муқаррарӣ ба истифодаи аломатҳо асос ёфтааст <([{\^-=$!|]})?*+.>, ки онҳоро бо аломатҳои алифбоӣ якҷоя кардан мумкин аст. Вобаста аз нақши онҳо, онҳоро ба якчанд гурӯҳ тақсим кардан мумкин аст:
1. Метааломатҳо барои мувофиқ кардани сарҳадҳои хат ё матн
МетаHowтер Мақсад
^ оғози хат
$ охири сатр
сарҳади калима
маҳдудияти калима нест
оғози воридшавӣ
охири бозии қаблӣ
охири вуруд
охири вуруд
2. Метааломатҳо барои ҷустуҷӯи синфҳои аломатҳо
МетаHowтер Мақсад
рамзи рақамӣ
аломати ғайрирақамӣ
хусусияти фазой
аломати холии бефосила
\w аломати алифбои рақамӣ ё зерхат
\ В ҳар гуна аломати ғайр аз алифбо, рақамӣ ё зерхат
. ягон характер
3. Мета аломатҳо барои ҷустуҷӯи аломатҳои таҳрири матн
МетаHowтер Мақсад
аломати ҷадвал
\n аломати сатри нав
аломати бозгашти вагон
ба саҳифаи нав гузаред
\u0085 аломати сатри оянда
\ у 2028 аломати ҷудокунандаи хат
\ у 2029 аломати ҷудокунандаи параграф
4. Метаҳакматҳо барои гурӯҳбандии аломатҳо
МетаHowтер Мақсад
[a B C] ҳар яке аз боло (a, b, ё c)
[^abc] ҳар чизи дигаре, ки дар рӯйхат оварда шудаанд (на a, b, c)
[a-zA-Z] якҷояшавии диапазон (ҳарфҳои лотинӣ аз a то z ба ҳарфҳо ҳассос нестанд)
[ad[mp]] пайванди аломатҳо (а то d ва м ба p)
[az&&[def]] чорроҳаи рамзҳо (рамзҳои d, e, f)
[az&&[^bc]] кам кардани аломатҳо (аломатҳои a, dz)
5. Метасимволҳо барои нишон додани шумораи аломатҳо – миқдорҳо. Миқдор ҳамеша пас аз аломат ё гурӯҳи аломатҳо меояд.
МетаHowтер Мақсад
? як ё бедарак
* сифр ё бештар маротиба
+ як ё якчанд маротиба
{н} n маротиба
{н,} n маротиба ё бештар
{н,м} на камтар аз n маротиба ва на бештар аз m маротиба

Ҳолати миқдорбандии хасис

Хусусияти махсуси миқдорҳо қобorяти истифода бурдани онҳо дар шеваҳои гуногун аст: тамаъкорӣ, фавқулода ва танбалӣ. Ҳолати изофаи тамаъкорӣ бо илова кардани аломати " +" пас аз миқдор ва ҳолати танбалӣ бо илова кардани аломати " ?" фаъол карда мешавад. Барои намуна:
"A.+a" // greedy mode
"A.++a" // over-greedy mode
"A.+?a" // lazy mode
Бо истифода аз ин қолаб ҳамчун намуна, биёед бифаҳмем, ки миқдорҳо дар режимҳои гуногун чӣ гуна кор мекунанд. Бо нобаёнӣ, миқдор дар ҳолати тамаъкорӣ кор мекунад. Ин маънои онро дорад, ки он дарозтарин мувофиқати имконпазирро дар сатр меҷӯяд. Дар натиҷаи иҷро кардани ин code:
public static void main(String[] args) {
    String text = "Egor Alla Alexander";
    Pattern pattern = Pattern.compile("A.+a");
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println(text.substring(matcher.start(), matcher.end()));
    }
}
мо натиҷаи зеринро ба даст меорем: Alla Alexa Алгоритми ҷустуҷӯ барои намунаи додашуда " А.+а" бо пайдарпаии зерин иҷро карда мешавад:
  1. Дар намунаи додашуда аломати аввал ҳарфи русӣ аст А. Matcherонро бо ҳар аломати матн, аз мавқеи сифр сар карда, мувофиқат мекунад. Дар мавқеъи сифр дар матни мо аломат мавҷуд аст Е, бинобар ин, Matcherон аломатҳои матнро пай дар пай мегузарад, то он даме, ки он ба мувофиқат бо намуна мувофиқат кунад. Дар мисоли мо ин рамз дар мавқеи № 5 аст.

    Ифодаҳои муқаррарӣ дар Java - 2
  2. Пас аз пайдо шудани мувофиқат бо аломати якуми нақш, Matcherон мувофиқатро бо аломати дуюми нақш тафтиш мекунад. Дар ҳолати мо, ин аломати " .", ки ҳар як аломатро ифода мекунад.

    Ифодаҳои муқаррарӣ дар Java - 3

    Дар мавқеи шашум рамзи ҳарф аст л. Албатта, он ба намунаи "ҳар гуна аломат" мувофиқат мекунад.

  3. Matcherба тафтиши аломати навбатӣ аз намуна мегузарад. Дар қолаби мо, он бо истифода аз .+миқдори муайянкунандаи " " муайян карда шудааст. Азбаски шумораи такрори «ягон аломат» дар қолаб як ё якчанд маротиба аст, Matcherон бо навбат аломати навбатиро аз сатр мегирад ва мувофиқати онро ба намуна месанҷад, то он даме, ки шарти «ягон аломат» иҷро карда шавад. дар мисоли мо — то охири сатр (аз мавкеи No 7 — раками 18 матн).

    Ифодаҳои муқаррарӣ дар Java - 4

    Дарвоқеъ, Matcherон тамоми хатро то ба охир мегирад - дар ин ҷо "тамаъ" -и он зоҳир мешавад.

  4. Пас аз Matcherрасидан ба охири матн ва анҷом додани тафтиши А.+қисми “ ” намуна, Матчер ба тафтиши боқимондаи намуна - аломати ҳарф оғоз мекунад а. Азбаски матн дар самти пеш ба охир расид, чек аз аломати охирин сар карда, дар самти баръакс сурат мегирад:

    Ифодаҳои муқаррарӣ дар Java - 5
  5. MatcherМиқдори такрорҳоро дар қолаби " .+"ба хотир меорад, ки дар он ба охири матн расида буд, аз ин рӯ шумораи такрорҳоро як маротиба кам мекунад ва намунаи матнро то пайдо шудани мувофиқат тафтиш мекунад: Ифодаҳои муқаррарӣ дар Java - 6

Ҳолати миқдордиҳандаи ултра-тамаъкор

Дар реҷаи хеле тамаъкор, гӯгирд ба механизми режими хасис монанд кор мекунад. Фарқият дар он аст, ки вақте ки шумо матнро то охири сатр мегиред, ҷустуҷӯ ба ақиб нест. Ин аст, ки се марҳилаи аввал дар ҳолати супер-тамаъкорӣ ба режими хасис монанд хоҳанд буд. Пас аз гирифтани тамоми сатр, мувофиқкунанда қисми боқимондаи намунаро илова мекунад ва онро бо сатри гирифташуда муқоиса мекунад. Дар мисоли мо, ҳангоми иҷрои усули асосӣ бо намунаи " А.++а", ҳеҷ гуна мувофиқат пайдо намешавад. Ифодаҳои муқаррарӣ дар Java - 7

Ҳолати танбали миқдор

  1. Дар ин реҷа, дар марҳилаи ибтидоӣ, ба мисли режими хасис, мувофиқат бо аломати якуми намуна ҷустуҷӯ карда мешавад:

    Ифодаҳои муқаррарӣ дар Java - 8
  2. Баъдан, он мувофиқатро бо аломати навбатии намуна ҷустуҷӯ мекунад - ҳар гуна аломат:

    Ифодаҳои муқаррарӣ дар Java - 9
  3. Баръакси режими тамаъкорӣ, режими танбалӣ мувофиқати кӯтоҳтаринро дар матн ҷустуҷӯ мекунад, бинобар ин пас аз дарёфти мувофиқат бо аломати дуюми намуна, ки бо нуқта нишон дода шудааст ва бо аломати мавқеи № 6 матн мувофиқат мекунад, он мувофиқат мекунад. Matcherтафтиш мекунад, ки оё матн ба боқимондаи намуна - аломати “ а” мувофиқат мекунад.

    Ифодаҳои муқаррарӣ дар Java - 10
  4. Азбаски мувофиқат бо намунаи матн пайдо нашудааст (дар мавқеъи № 7 дар матн аломати “ л“ мавҷуд аст), Matcherон дар қолаби дигар “ҳар гуна аломат”-ро илова мекунад, зеро он як ё якчанд маротиба нишон дода шудааст, ва боз намунаро бо матни мавқеъҳои аз № 5 то 8 муқоиса мекунад:

    Ифодаҳои муқаррарӣ дар Java - 11
  5. Дар мо бошад, як гугирд ёфт шуд, вале ба охири матн хануз нарасидааст. Аз ин рӯ, аз мавқеъи № 9 санҷиш аз ҷустуҷӯи аломати якуми намуна бо истифода аз алгоритми шабеҳ оғоз мешавад ва сипас то охири матн такрор мешавад.

    Ифодаҳои муқаррарӣ дар Java - 12
Дар натиҷаи усул mainҳангоми истифодаи А.+?ақолаби " ", мо натиҷаи зеринро ба даст меорем: Алла Alexa Тавре ки аз мисоли мо дида мешавад, ҳангоми истифодаи режимҳои миқдор барои як қолаб, мо натиҷаҳои гуногун ба даст овардем. Аз ин рӯ, зарур аст, ки ин хусусиятро ба назар гирифта, вобаста ба натиҷаи дилхоҳ ҳангоми ҷустуҷӯ режими дилхоҳро интихоб кунед.

Фирор кардани аломатҳо дар ибораҳои муқаррарӣ

Азбаски ифодаи муқаррарӣ дар Java, ё дақиқтараш муаррифии ибтидоии он, бо истифода аз сатри литерали муайян карда мешавад, бояд қоидаҳои мушаххасоти Java, ки ба литералҳои сатр алоқаманданд, ба назар гирифта шаванд. Аз ҷумла, аломати баръакси хат " \" дар сатри литералӣ дар codeи ибтидоии Java ҳамчун аломати фирор тафсир карда мешавад, ки компиляторро огоҳ мекунад, ки аломати пас аз он аломати махсус аст ва бояд ба таври махсус тафсир карда шавад. Барои намуна:
String s = "The root directory is \nWindows";//wrap Windows to a new line
String s = "The root directory is \u00A7Windows";//insert paragraph character before Windows
Аз ин рӯ, дар сатри литералҳо, ки ифодаи муқаррариро тавсиф мекунанд ва \аломати " " -ро истифода мебаранд (масалан, барои мета аломатҳо), он бояд дучанд карда шавад , то компилятори bytecodeи Java онро ба таври дигар тафсир накунад. Барои намуна:
String regex = "\\s"; // template for searching for space characters
String regex = "\"Windows\""; // pattern to search for the string "Windows"
Агар мо нақшаи онҳоро ҳамчун аломатҳои "муқаррарӣ" истифода барем, аломати бозгашти дукарата низ бояд барои гурехтани аломатҳои махсус истифода шавад. Барои намуна:
String regex = "How\\?"; // template for searching the string "How?"

Усулҳои синфи Pattern

Синф Patternусулҳои дигари кор бо ибораҳои муқаррариро дорад: String pattern()– тасвири сатри аслии ифодаи муқаррариро, ки аз он an object сохта шудааст, бармегардонад Pattern:
Pattern pattern = Pattern.compile("abc");
System.out.println(Pattern.pattern())//"abc"
static boolean matches(String regex, CharSequence input)– ба шумо имкон медиҳад, ки ифодаи муқаррарии дар параметри regex додашударо нисбат ба матни дар параметр гузаронидашуда тафтиш кунед input. Бозмегардонад: ҳақиқӣ – агар матн ба намуна мувофиқат кунад; бардурӯғ - дар акси ҳол; Мисол:
System.out.println(Pattern.matches("A.+a","Alla"));//true
System.out.println(Pattern.matches("A.+a","Egor Alla Alexander"));//false
int flags()flagsарзишҳои параметри шаблонро, ки ҳангоми сохтани он муқаррар шуда буданд, бармегардонад ё 0 агар ин параметр муқаррар нашуда бошад. Мисол:
Pattern pattern = Pattern.compile("abc");
System.out.println(pattern.flags());// 0
Pattern pattern = Pattern.compile("abc",Pattern.CASE_INSENSITIVE);
System.out.println(pattern.flags());// 2
String[] split(CharSequence text, int limit)– матни ҳамчун параметр додашударо ба массиви элементҳо тақсим мекунад String. Параметр limitшумораи максималии мувофиқатҳоеро, ки дар матн ҷустуҷӯ мешаванд, муайян мекунад:
  • кай limit>0– ҷустуҷӯи limit-1мувофиқат анҷом дода мешавад;
  • дар limit<0- ҳамаи мувофиқатҳоро дар матн ҷустуҷӯ мекунад
  • вақте limit=0– ҳамаи мувофиқатҳоро дар матн ҷустуҷӯ мекунад, дар ҳоле ки сатрҳои холӣ дар охири массив хориҷ карда мешаванд;
Мисол:
public static void main(String[] args) {
    String text = "Egor Alla Anna";
    Pattern pattern = Pattern.compile("\\s");
    String[] strings = pattern.split(text,2);
    for (String s : strings) {
        System.out.println(s);
    }
    System.out.println("---------");
    String[] strings1 = pattern.split(text);
    for (String s : strings1) {
        System.out.println(s);
    }
}
Натиҷаи консол: Егор Алла Анна -------- Егор Алла Анна Мо дар зер усули дигари синфро барои сохтани an object дида мебароем Matcher.

Усулҳои синфи мувофиқ

Matcherсинфест, ки аз он an object барои ҷустуҷӯи намунаҳо сохта мешавад. Matcher– ин «муҳаррики ҷустуҷӯ», «муҳаррик»-и ибораҳои муқаррарӣ мебошад. Барои ҷустуҷӯ ба ӯ ду чизро додан лозим аст: намунаи ҷустуҷӯ ва "суроға" барои ҷустуҷӯ. Барои сохтани an object, Matcherусули зерин дар синф пешбинӣ шудааст Pattern: рublic Matcher matcher(CharSequence input) Ҳамчун аргумент, усул пайдарпайии аломатҳоро мегирад, ки дар он ҷустуҷӯ анҷом дода мешавад. Инҳо an objectҳои синфҳо мебошанд, ки интерфейсро амалӣ мекунанд CharSequence. StringШумо метавонед на танҳо , балки StringBuffer, StringBuilder, Segmentва ҳамчун далел гузаред CharBuffer. Шаблони ҷустуҷӯ an objectи синфест, Patternки дар он метод номида мешавад matcher. Намунаи сохтани мувофиқ:
Pattern p = Pattern.compile("a*b");// compiled the regular expression into a view
Matcher m = p.matcher("aaaaab");//created a search engine in the text “aaaaab” using the pattern "a*b"
Акнун бо ёрии «муҳаррики ҷустуҷӯ»-и худ мо метавонем мувофиқатҳоро ҷустуҷӯ кунем, мавқеъи мувофиқатро дар матн фаҳмем ва матнро бо истифода аз усулҳои синф иваз кунем. Усул boolean find()мувофиқати навбатиро дар матн бо намуна ҷустуҷӯ мекунад. Бо истифода аз ин усул ва оператори даврӣ шумо метавонед тамоми матнро мувофиқи модели рӯйдодҳо таҳлил кунед (амалҳои заруриро ҳангоми рух додани ҳодиса - дарёфти мувофиқат дар матн иҷро кунед). Масалан, бо истифода аз усулҳои ин синф int start()шумо int end()метавонед мавқеъҳои мувофиқатро дар матн муайян кунед ва бо истифода аз усулҳо мувофиқатҳоро дар матн бо матни ивазкунандаи дигар иваз кунед String replaceFirst(String replacement). String replaceAll(String replacement)Мисол:
public static void main(String[] args) {
    String text = "Egor Alla Anna";
    Pattern pattern = Pattern.compile("A.+?a");

    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        int start=matcher.start();
        int end=matcher.end();
        System.out.println("Match found" + text.substring(start,end) + " с "+ start + " By " + (end-1) + "position");
    }
    System.out.println(matcher.replaceFirst("Ira"));
    System.out.println(matcher.replaceAll("Olga"));
    System.out.println(text);
}
Баромади барнома: Гугирд ёфт шуд Алла аз 5 то 8 мавқеъ Гугирд ёфт шуд Анна аз 10 то 13 мавқеъ Егор Ира Анна Егор Ольга Ольга Егор Алла Анна Аз мисол маълум мешавад, ки усулҳо an objectи нав - сатрро replaceFirstба вуҷуд меоранд . матни сарчашмаест, ки дар он мувофиқат бо қолаб бо матне, ки ба усул ҳамчун аргумент интиқол дода мешавад, иваз карда мешавад. Гузашта аз ин, усули иваз танҳо бозии аввал, ва ҳамаи бозиҳои дар санҷиш. Матни аслӣ бетағйир боқӣ мемонад. Истифодаи усулҳои дигари синфӣ , инчунин намунаҳои ибораҳои муқаррариро дар ин силсила мақолаҳо дидан мумкин аст . Амалҳои маъмултарин бо ибораҳои муқаррарӣ ҳангоми кор бо матн аз синфҳо мебошанд ва дар . Инҳо усулҳое мебошанд, ки , , , . Аммо дар асл, "зери кулоҳ" онҳо аз ва . Аз ин рӯ, агар ба шумо лозим ояд, ки матнро иваз кунед ё сатрҳоро дар барнома бидуни навиштани codeи нолозим муқоиса кунед, аз усулҳои . Агар ба шумо қобorятҳои пешрафта лозим бошад, дар бораи синфҳо ва . replaceAllStringreplaceFirstreplaceAllMatcherPatternMatcherStringsplitmatchesreplaceFirstreplaceAllPatternMatcherStringPatternMatcher

Хулоса

Ифодаи муқаррарӣ дар барномаи Java бо истифода аз сатрҳое тасвир шудааст, ки ба намунаи муқаррарнамудаи қоидаҳо мувофиқат мекунанд. Вақте ки code кор мекунад, Java ин сатрро ба an objectи синф дубора тартиб медиҳад Patternва an objectи синфро Matcherбарои ёфтани мувофиқат дар матн истифода мебарад. Тавре ки дар аввал гуфтам, ибораҳои муқаррарӣ аксар вақт барои баъдӣ як сӯ гузошта мешаванд, ки мавзӯи душвор ҳисобида мешаванд. Аммо, агар шумо асосҳои синтаксис, мета аломатҳо, фирорро фаҳмед ва мисолҳои ибораҳои муқаррариро омӯзед, онҳо назар ба он ки дар назари аввал ба назар мерасанд, хеле соддатар мешаванд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION