JavaRush /Блоги Java /Random-TG /Ифодаҳои муқаррарӣ дар Java, Қисми 3

Ифодаҳои муқаррарӣ дар Java, Қисми 3

Дар гурӯҳ нашр шудааст
Мо ба таваҷҷуҳи шумо тарҷумаи дастури мухтасарро оид ба ибораҳои муқаррарӣ дар Java пешкаш мекунем, ки аз ҷониби Ҷефф Фризен барои вебсайти javaworld навишта шудааст . Барои осонии хондан, мо мақоларо ба чанд қисм тақсим кардем. Ифодаҳои муқаррарӣ дар Java, Қисми 3 - 1Ифодаҳои муқаррарӣ дар Java, Қисми 1 Ифодаҳои муқаррарӣ дар Java, Қисми 2

Бо Regex API вазифаҳои барномасозии умумиро содда кунед

Дар қисмҳои 1 ва 2-и ин мақола шумо бо ифодаҳои муқаррарӣ ва API Regex шинос шудаед. Шумо дар бораи синф маълумот гирифтед Patternва аз мисолҳое гузаштед, ки сохторҳои ифодаи муқаррариро нишон медиҳанд, аз мувофиқати намунаи оддӣ бо истифода аз сатрҳои аслӣ то мувофиқати мураккабтар бо истифода аз диапазонҳо, мувофиқаткунакҳои сарҳадӣ ва миқдор. Дар ин ва қисмҳои минбаъда мо масъалаҳоеро баррасӣ мекунем, ки дар қисми аввал дарҷ нашудаанд, усулҳои мувофиқи дарсҳоро меомӯзем Patternва Matcher. PatternSyntaxExceptionШумо инчунин ду утorтро меомӯзед, ки ифодаҳои муқаррариро барои осон кардани мушкилоти умумии барномасозӣ истифода мебаранд. Якум шарҳҳоро аз code барои ҳуҷҷатҳо истихроҷ мекунад. Дуюм китобхонаи codeи такрористеъмолшаванда мебошад, ки барои анҷом додани таҳлor лексикӣ пешбинӣ шудааст - ҷузъи муҳими ассемблерҳо, компиляторҳо ва нармафзори шабеҳ.

Зеркашӣ кардани codeи манбаъ

Шумо метавонед ҳама рамзи сарчашмаро (аз ҷониби Ҷефф Фризен барои JavaWorld сохтааст) барои барномаҳои намоишии ин мақола аз ин ҷо дастрас кунед .

Омӯзиши API Regex

Pattern, Matcherва PatternSyntaxExceptionсе синф мебошанд, ки API-и Regex-ро ташкил медиҳанд. Ҳар яке аз онҳо усулҳоеро пешниҳод мекунанд, ки ба шумо имкон медиҳанд ифодаҳои муқаррариро дар codeи худ истифода баред.

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

Мисоли синф Patternяк ифодаи муқаррарии тартибдодашуда мебошад, ки ҳамчун намуна низ маълум аст. Ифодаҳои муқаррарӣ барои беҳтар кардани иҷрои амалиёти мувофиқ кардани намуна тартиб дода мешаванд. Усулҳои статикии зерин таҳияро дастгирӣ мекунанд.
  • Pattern compile(String regex)мундариҷаро regexба намояндагии фосилавӣ, ки дар нав нигоҳ дошта мешавад, тартиб медиҳад Pattern. Ин усул ё истинодро ба an object бармегардонад, ё PatternSyntaxExceptionагар синтаксиси ифодаи муқаррарии беэътибор ошкор шавад, истисно мегузорад. Ҳар як an objectи синфе Matcher, ки аз ҷониби ин an object истифода мешавад Patternё аз ин an object бармегардад, танзимоти пешфарзии худро, ба монанди ҷустуҷӯи ҳассос ба ҳарфҳо истифода мебарад. Ҳамчун мисол, пораи code Pattern p = Pattern.compile("(?m)^\\."); an objectеро эҷод мекунад Pattern, ки тасвири тартибдодашудаи ифодаи муқаррариро барои мувофиқ кардани сатрҳое, ки бо аломати нуқта оғоз мешаванд, нигоҳ медорад.

  • Pattern compile(String regex, int flags)як масъаларо ҳал мекунад Pattern compile(String regex), вале бо назардошти flags: маҷмӯи константаҳои битӣ барои парчамҳои битии навъи OR. Синф Patternконстантаҳоро эълон мекунад CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINES, ки онҳоро бо истифода аз OR (масалан, CASE_INSENSITIVE | DOTALL) якҷоя кардан мумкин аст ва ҳамчун аргумент интиқол дода мешавад flags.

  • Ба истиснои CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS, ин константаҳо алтернатива ба ифодаҳои парчами дохorи дар қисми 1 нишон додашуда мебошанд. Агар константаи парчам ғайр аз константаҳои дар синф муайяншуда дучор ояд Pattern, усул Pattern compile(String regex, int flags) истисноро мепартояд java.lang.IllegalArgumentException. Масалан, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);муодor мисоли қаблӣ, бо Pattern.MULTILINEифодаи доимӣ ва парчами лонашуда (?m)як чизро иҷро мекунад.
Баъзан зарур аст, ки нусхаи сатри аслии ифодаи муқаррарӣ, ки дар an object тартиб дода шудааст Pattern, дар баробари парчамҳои истифодашавандаи он гирифта шавад. Барои ин, шумо метавонед усулҳои зеринро даъват кунед:
  • String pattern()сатри аслии ифодаи муқаррариро, ки ба Pattern.

  • int flags()парчамҳои an objectро бармегардонад Pattern.
Пас аз гирифтани an object Pattern, он одатан барои ба даст овардани an object Matcherбарои иҷрои амалиёти мувофиқ кардани намуна истифода мешавад. Ин усул Matcher matcher(Charsequence input)an objectеро месозад Matcher, ки матнро inputбарои мувофиқат бо намунаи an object ҷустуҷӯ мекунад Pattern. Ҳангоми даъват, он истинодро ба ин an object бармегардонад Matcher. Масалан, фармон барои an objectе Matcher m = p.matcher(args[1]);бармегардад , ки аз ҷониби тағирёбанда истинод шудааст . MatcherPatternp
Ҷустуҷӯи яквақта
Усули static boolean matches(String regex, CharSequence input)синф Patternба шумо имкон медиҳад, ки ҳангоми сохтани an objectҳо Patternва Matcherҷустуҷӯи якдафъаина бо истифода аз қолаб сарфа кунед. Ин усул ҳақиқиро бармегардонад, агар inputнамуна мувофиқ бошад regex, дар акси ҳол он бардурӯғ бар мегардонад. Агар ифодаи муқаррарӣ хатои синтаксисӣ дошта бошад, усул истисноро мепартояд PatternSyntaxException. Масалан, System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only"));чоп мекунад true, ки тасдиқ мекунад, ки ибора all lowercase letters and whitespace onlyтанҳо фосила ва аломатҳои хурд дорад.
Ифодаҳои муқаррарӣ дар Java, Қисми 3 - 2

Тақсимоти матн

Аксарияти таҳиягарон ҳадди аққал як маротиба codeи хаттӣ доранд, то матни воридшударо ба қисмҳои ҷузъии он тақсим кунанд, ба монанди табдил додани ҳисоби корманд дар асоси матн ба маҷмӯи майдонҳо. Синф Patternимкон медиҳад, ки ин вазифаи дилгиркунандаро бо истифода аз ду усули тақсимкунии матн осонтар ҳал кунад:
  • Усул мувофиқи мувофиқати пайдошуда ба намунаи an object String[] split(CharSequence text, int limit)тақсим мешавад ва натиҷаҳоро дар массив бармегардонад. Ҳар як унсури массив пайдарпаии матнро муайян мекунад, ки аз пайдарпаии навбатӣ бо порчаи матни мувофиқи намуна (ё охири матн) ҷудо карда шудааст. Элементҳои массив бо ҳамон тартибе, ки дар .textPatterntext

    Дар ин усул шумораи элементҳои массив аз параметр вобаста аст limit, ки он инчунин шумораи мувофиқатҳои пайдошударо назорат мекунад.

    • Қимати мусбӣ на бештар аз limit-1мувофиқатро ҷустуҷӯ мекунад ва дарозии массив аз limitэлементҳо зиёд нест.
    • Агар арзиш манфӣ бошад, ҳама мувофиқатҳои имконпазир ҷустуҷӯ карда мешаванд ва дарозии массив метавонад ихтиёрӣ бошад.
    • Агар арзиш сифр бошад, ҳамаи мувофиқатҳои имконпазир ҷустуҷӯ карда мешаванд, дарозии массив метавонад ихтиёрӣ бошад ва сатрҳои холӣ дар охири он партофта мешаванд.

  • Усул String[] split(CharSequence text)усули қаблиро бо 0 ҳамчун далели маҳдуд даъват мекунад ва натиҷаи занги худро бармегардонад.
Дар зер натиҷаҳои усули split(CharSequence text)ҳалли масъалаи тақсим кардани ҳисоби корманд ба соҳаҳои алоҳидаи ном, синну сол, суроғаи почта ва музди меҳнат оварда шудаанд:
Pattern p = Pattern.compile(",\\s");
String[] fields = p.split("John Doe, 47, Hillsboro Road, 32000");
for (int i = 0; i < fields.length; i++)
   System.out.println(fields[i]);
Рамзи дар боло зикршуда ифодаи муқаррариро барои пайдо кардани аломати вергул ва пас аз як аломати фосила тавсиф мекунад. Дар ин ҷо натиҷаҳои иҷрои он ҳастанд:
John Doe
47
Hillsboro Road
32000

Предикатҳои шаблон ва API Streams

Дар Java 8 Patternметоде дар синф пайдо шуд . Ин усул предикат (функсия бо арзиши мантиқӣ) эҷод мекунад, ки барои мувофиқ кардани намуна истифода мешавад. Истифодаи ин усул дар пораи codeи зерин нишон дода шудааст: Predicate asPredicate()
List progLangs = Arrays.asList("apl", "basic", "c", "c++", "c#", "cobol", "java", "javascript", "perl", "python", "scala");
Pattern p = Pattern.compile("^c");
progLangs.stream().filter(p.asPredicate()).forEach(System.out::println);
Ин code рӯйхати номҳои забони барномасозиро эҷод мекунад ва баъд намунаеро тартиб медиҳад, то ҳамаи номҳоеро, ки бо ҳарф сар мешаванд, пайдо кунанд c. Сатри охирини codeи боло қабули ҷараёни силсилавии маълумотро бо ин рӯйхат ҳамчун манбаъ амалӣ мекунад. Он бо истифода аз функсияи мантиқӣ филтрро насб мекунад asPredicate(), ки вақте ки ном бо ҳарф сар мешавад cва дар ҷараёни такрор такрор мешавад ва номҳои мувофиқро ба баромади стандартӣ чоп мекунад, ҳақиқиро бармегардонад. Ин сатри охирин ба ҳалқаи муқаррарии зерин баробар аст, ки аз барномаи RegexDemo аз Қисми 1 шинос аст:
for (String progLang: progLangs)
   if (p.matcher(progLang).find())
      System.out.println(progLang);

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

Як мисоли синф Matcherмеханизми иҷрои амалиёти мувофиқати намунаро дар пайдарпаии аломатҳо тавассути тафсири ифодаи муқаррарии тартибдодашудаи синф тавсиф мекунад Pattern. Объектҳои синф Matcherнамудҳои гуногуни амалиёти ҷустуҷӯии намунаҳоро дастгирӣ мекунанд:
  • Ин усул boolean find()матни воридшударо барои мувофиқати оянда ҷустуҷӯ мекунад. Ин усул сканерро ё дар аввали матни муайяншуда ё дар аломати аввал пас аз мувофиқати қаблӣ оғоз мекунад. Варианти дуюм танҳо дар сурате имконпазир аст, ки занги қаблӣ ба ин усул ҳақиқӣ баргардонида шавад ва ҳалкунанда аз нав барқарор карда нашавад. Дар ҳар сурат, агар ҷустуҷӯ муваффақ бошад, арзиши мантиқии true бармегардад. Намунаи ин усулро дар RegexDemoҚисми 1 дидан мумкин аст.

  • Ин усул boolean find(int start)мувофиқаткунандаро аз нав танзим мекунад ва матнро барои мувофиқати оянда ҷустуҷӯ мекунад. Намоиш аз мавқеъи муайянкардаи параметр оғоз мешавад start. Агар ҷустуҷӯ муваффақ бошад, арзиши мантиқии true бармегардад. Масалан, m.find(1);матнро аз мавқеъ сар карда скан мекунад 1(мавқеи 0 сарфи назар карда мешавад). Агар параметр startдорои арзиши манфӣ ё арзиши бузургтар аз дарозии матни мувофиқ бошад, усул истисноро мепартояд java.lang.IndexOutOfBoundsException.

  • Ин усул boolean matches()кӯшиш мекунад, ки тамоми матнро бо намуна мувофиқ созад. Он арзиши мантиқии ҳақиқиро бармегардонад, агар ҳамаи матн ба намуна мувофиқат кунад. Масалан, code Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());баромад мекунад false, зеро аломат !аломати калима нест.

  • Усул boolean lookingAt()кӯшиш мекунад, ки матни муайяншударо бо намуна мувофиқ созад. Ин усул ҳақиқиро бармегардонад, агар ягон қисми матн ба намуна мувофиқат кунад. Баръакси усул matches();, ҳама матн набояд ба намуна мувофиқат кунад. Масалан, Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());он баромад хоҳад кард true, зеро ибтидои матн abc!танҳо аз аломатҳои калимасоз иборат аст.

Баръакси an objectҳои синфӣ Pattern, an objectҳои синф Matcherмаълумоти ҳолатиро нигоҳ медоранд. Баъзан ба шумо лозим меояд, ки мувофиқаткунандаро аз нав танзим кунед, то ин маълумотро пас аз анҷоми ҷустуҷӯи намуна тоза кунед. Усулҳои зерин барои аз нав танзимкунии резолвер дастрасанд:
  • Ин усул Matcher reset()ҳолати мувофиқаткунандаро аз нав барқарор мекунад, аз ҷумла мавқеъи ба охири замимашаванда (аз нав танзимкунии 0). Амалиёти навбатии ҷустуҷӯи намуна аз аввали матни мувофиқ оғоз мешавад. Истинодро ба an objectи ҷорӣ бармегардонад Matcher. Масалан, m.reset();ҳалкунандаеро, ки аз ҷониби m.

  • Усул Matcher reset(CharSequence text)ҳолати ҳалкунандаро аз нав барқарор мекунад ва матни ҳалкунандаро ба text. Амалиёти навбатии ҷустуҷӯи намуна дар оғози матни нави мувофиқ оғоз мешавад. Истинодро ба an objectи ҷорӣ бармегардонад Matcher. Масалан, m.reset("new text");ҳалкунандаи истинодшударо аз нав танзим мекунад mва матни ҳалкунандаи навро ба "new text".

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

Илова кардани матн ба охир

Мавқеи мувофиқкунандае, ки ба охир замима мешавад, оғози матни мувофиқро, ки ба охири an objectи навъи замима шудааст, муайян мекунад java.lang.StringBuffer. Усулҳои зерин ин мавқеъро истифода мебаранд:
  • Ин усул Matcher appendReplacement(StringBuffer sb, String replacement)аломатҳои матни мувофиқро мехонад ва онҳоро ба охири an objectи StringBufferбо аргумент истинодшуда замима мекунад sb. Ин усул хонданро дар аломати охирини пеш аз мувофиқати намунаи қаблӣ қатъ мекунад. Минбаъд, усул аломатҳои an objectи навъи Stringбо аргумент истинодшавандаро replacementба охири an object замима мекунад StringBuffer(сатр replacementметавонад истинодҳоро ба пайдарпайии матни ҳангоми ҷустуҷӯи қаблӣ гирифташуда дошта бошад; онҳо бо истифода аз аломатҳо ($)ва рақамҳои гурӯҳи забтшуда муайян карда мешаванд). Ниҳоят, усул арзиши мавқеи мувофиқро барои замима ба мавқеи аломати мувофиқи охирин бо иловаи як муқаррар мекунад ва сипас истинодро ба мувофиқати ҷорӣ бармегардонад.

  • Усули Matcher appendReplacement(StringBuffer sb, String replacement)истисноро мепартояд java.lang.IllegalStateException, агар мувофиқкунанда то ҳол мувофиқат наёфта бошад ё кӯшиши ҷустуҷӯи қаблӣ ноком шавад. Он истисноро мепартояд IndexOutOfBoundsException, агар сатр replacementгурӯҳи сабтро, ки дар намуна нест, муайян кунад).

  • Усул StringBuffer appendTail(StringBuffer sb)тамоми матнро ба an object илова мекунад StringBufferва истинодро ба он an object бармегардонад. Пас аз занги усули охирин appendReplacement(StringBuffer sb, String replacement), методро appendTail(StringBuffer sb)барои нусхабардории матни боқимонда ба an object даъват кунед StringBuffer.

Гурӯҳҳои забтшуда
Тавре ки шумо аз Қисми 1 ёд доред, гурӯҳи забткунӣ ин пайдарпаии аломатҳоест, ки дар қавс ( ()) мета аломатҳои дохил карда шудаанд. Мақсади ин сохтмон нигоҳ доштани аломатҳои ёфтшуда барои истифодаи баъдӣ ҳангоми мувофиқати намуна мебошад. Ҳама аломатҳои гурӯҳи забтшуда ҳангоми ҷустуҷӯи намуна ҳамчун як ягона баррасӣ карда мешаванд.
Рамзи зерин appendReplacement(StringBuffer sb, String replacement)ва усулҳоро appendTail(StringBuffer sbбарои иваз кардани ҳама рӯйдодҳои пайдарпайии аломатҳо дар матни сарчашма catбо : даъват мекунад caterpillar:
Pattern p = Pattern.compile("(cat)");
Matcher m = p.matcher("one cat, two cats, or three cats on a fence");
StringBuffer sb = new StringBuffer();
while (m.find())
   m.appendReplacement(sb, "$1erpillar");
m.appendTail(sb);
System.out.println(sb);
Истифодаи гурӯҳи забтшуда ва истинод ба он дар матни ивазкунанда ба барнома мегӯяд, ки erpillarпас аз ҳар як пайдоиши cat. Натиҷаи иҷрои ин code чунин аст: one caterpillar, two caterpillars, or three caterpillars on a fence

Иваз кардани матн

Синф Matcherба мо ду усули ивазкунии матнро, ки ба appendReplacement(StringBuffer sb, String replacement). Бо истифода аз ин усулҳо, шумо метавонед пайдоиши аввалини [матни ивазшуда] ё ҳама рӯйдодҳоро иваз кунед:
  • Усули String replaceFirst(String replacement)мувофиқаткунандаро аз нав танзим мекунад, an objectи нав месозад String, ҳамаи аломатҳои матни мувофиқро (то мувофиқати аввал) ба ин сатр нусхабардорӣ мекунад, аломатҳоро аз охири он замима мекунад replacement, аломатҳои боқимондаро ба сатр нусхабардорӣ мекунад ва an object String(сатр replacementметавонад истинодҳоеро дар бар гирад, ки дар давоми пайдарпайии матни ҷустуҷӯи қаблӣ бо истифода аз рамзҳои доллар ва рақамҳои гурӯҳи забтшуда гирифта шудаанд).

  • Усул String replaceAll(String replacement)ба усули шабеҳ кор мекунад String replaceFirst(String replacement), аммо replacementҳама мувофиқати пайдошударо бо аломатҳои сатр иваз мекунад.

Ифодаи муқаррарӣ \s+як ё якчанд аломатҳои холиро дар матни воридотӣ ҷустуҷӯ мекунад. Дар зер, мо ин ифодаи муқаррариро истифода мебарем ва усулеро replaceAll(String replacement)барои нест кардани ҷойҳои такрорӣ даъват мекунем:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем      \t\t лишние пробелы.   ");
System.out.println(m.replaceAll(" "));
Инҳоянд натиҷаҳо: Удаляем лишние пробелы. Ифодаҳои муқаррарӣ дар Java, Қисми 4 Ифодаҳои муқаррарӣ дар Java, Қисми 5
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION