JavaRush /Java блогу /Random-KY /Java тилиндеги кадимки туюнтмалар, 3-бөлүк

Java тилиндеги кадимки туюнтмалар, 3-бөлүк

Группада жарыяланган
Биз сиздердин назарыңыздарга javaworld веб-сайты үчүн Джефф Фризен тарабынан жазылган Java тorндеги туруктуу сөз айкаштары боюнча кыска жолдун котормосун сунуштайбыз . Окууга ыңгайлуу болушу үчүн биз макаланы бир нече бөлүккө бөлдүк. Java тorндеги кадимки туюнтмалар, 3-бөлүк - 1Java тorндеги кадимки туюнтмалар, 1-бөлүк Java тorндеги кадимки туюнтмалар, 2-бөлүк

Regex API менен жалпы программалоо тапшырмаларын жөнөкөйлөштүрүү

Бул макаланын 1 жана 2-бөлүктөрүндө сиз кадимки туюнтмалар жана Regex API менен тааныштыңыз. Сиз класс менен таанышып Pattern, кадимки саптарды колдонуу менен жөнөкөй үлгү дал келүүсүнөн диапазондорду, чек араларды жана сандык көрсөткүчтөрдү колдонуу менен татаалыраак дал келүүгө чейин кадимки туюнтма түзүмдөрүн көрсөткөн мисалдарды карап чыктыңыз. Ушул жана кийинки бөлүмдөрдө биз биринчи бөлүктө каралбаган маселелерди карап чыгабыз, класстардын тиешелүү ыкмаларын Patternжана Matcher. Сиз ошондой эле жалпы программалоо көйгөйлөрүн жеңилдетүү үчүн кадимки сөз айкаштарынPatternSyntaxException колдонгон эки утorтаны үйрөнөсүз . Биринчиси documentация үчүн codeдон комментарийлерди чыгарат. Экинчиси - лексикалык анализ жүргүзүү үчүн иштелип чыккан көп жолу колдонулуучу codeдун китепканасы - ассемблерлердин, компиляторлордун жана ушул сыяктуу программалык камсыздоонун маанилүү компоненти.

БУЛАК КОДУН ЖҮКТӨП АЛУУ

Бул макаладагы демо тиркемелер үчүн бардык баштапкы codeду (JavaWorld үчүн Джефф Фризен тарабынан түзүлгөн) бул жерден ала аласыз .

Regex API үйрөнүү

Pattern, Matcherжана PatternSyntaxExceptionRegex API түзгөн үч класс. Алардын ар бири сиздин codeуңузда кадимки туюнтмаларды колдонууга мүмкүндүк берүүчү ыкмаларды берет.

Pattern классынын методдору

Класстын үлгүсү Pattern- бул калып катары белгилүү болгон компиляцияланган туруктуу туюнтма. Регулярдуу туюнтмалар үлгү дал келүү операцияларынын натыйжалуулугун жакшыртуу үчүн түзүлөт. Төмөнкү статикалык ыкмалар компиляцияны колдойт.
  • Pattern compile(String regex)мазмунду regexжаңыда сакталган ортоңку өкүлчүлүккө түзөт Pattern. Бул ыкма же ийгorктүү болсо, an objectке шилтемени кайтарат, же PatternSyntaxExceptionжараксыз регулярдуу туюнтма синтаксиси аныкталса, өзгөчө абалды жаратат. MatcherБул an object тарабынан колдонулган же андан кайтарылган класстын кайсы болбосун an objectиси Patternөзүнүн демейки жөндөөлөрүн колдонот, мисалы, регистрге сезимтал издөө. Мисал катары, code үзүндүсү чекит белгиси менен башталган саптарга дал келүү үчүн кадимки туюнтумдун компиляцияланган өкүлчүлүгүн сактаган Pattern p = Pattern.compile("(?m)^\\."); an objectти түзөт .Pattern

  • Pattern compile(String regex, int flags)сыяктуу эле маселени чечет Pattern compile(String regex), бирок эске алуу менен flags: OR түрүндөгү бит желектери үчүн бит константаларынын жыйындысы. Класс биттик OR (мисалы, ) аркылуу бириктирorп , аргумент катары берилүүчү Patternконстанталарды жарыялайт .CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINESCASE_INSENSITIVE | DOTALLflags

  • 1-бөлүгүнөн тышкары CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS, бул константалар 1-бөлүктө көрсөтүлгөн уя салынган желек туюнтмаларына альтернатива болуп саналат. Эгерде класста аныкталгандан башка желек константасы кездешсе Pattern, метод Pattern compile(String regex, int flags) өзгөчө абалды жаратат java.lang.IllegalArgumentException. Мисалы, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);мурунку мисалга барабар, туруктуу Pattern.MULTILINEжана уя салынган желек туюнтмасы (?m)бир эле нерсени жасайт.
Кээде an objectке компиляцияланган регулярдуу сөз айкашынын түп нускасынын көчүрмөсүн Pattern, ал колдонгон желектер менен бирге алуу керек болот. Бул үчүн, сиз төмөнкү ыкмаларды чакыра аласыз:
  • String pattern()ге түзүлгөн баштапкы регулярдуу туюнтма сапты кайтарат Pattern.

  • int flags()an objectтин желектерин кайтарат Pattern.
Объектти алгандан кийин , адатта , үлгү дал келүү операцияларын аткаруу үчүн Patternan objectти алуу үчүн колдонулат . MatcherМетод an object үлгүсүнө дал келген текстти издеген Matcher matcher(Charsequence input)an objectти түзөт . Чакырганда, бул an objectке шилтеме кайтарат . Мисалы, буйрук өзгөрмө шилтеме кылган an object үчүн кайтарат . MatcherinputPatternMatcherMatcher m = p.matcher(args[1]);MatcherPatternp
Бир жолку издөө
static boolean matches(String regex, CharSequence input)Класс ыкмасы an objectтерди түзүүдө жана шаблон аркылуу бир жолку издөөдө Patternүнөмдөөгө мүмкүндүк берет . Бул ыкма үлгү дал келсе true кайтарат , антпесе ал жалган кайтарат. Эгерде кадимки туюнтма синтаксистик катаны камтыса, ыкма өзгөчө учурду жаратат . Мисалы, фраза боштуктарды жана кичине тамгаларды гана камтыганын ырастап басып чыгарат .PatternMatcherinputregexPatternSyntaxExceptionSystem.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only"));trueall lowercase letters and whitespace only
Java тorндеги кадимки туюнтмалар, 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]);
Жогорудагы code үтүр белгисин, андан кийин бир боштук белгисин табуу үчүн кадимки туюнтманы сүрөттөйт. Бул жерде анын аткарылышынын натыйжалары:
John Doe
47
Hillsboro Road
32000

Шаблон предикаттары жана Streams API

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 программалоо тorнин аталыштарынын тизмесин түзөт, андан кийин тамга менен башталган бардык аттарды табуу үчүн үлгү түзөт c. Жогорудагы codeдун акыркы сабы бул тизме менен берorштердин сериялык агымын кабыл алууну ишке ашырат. Ал буль функциясын колдонуп чыпканы орнотот asPredicate(), ал ат тамга менен башталганда чындыкты кайтарат cжана агым аркылуу кайталанып, стандарттык чыгарууга дал келген аттарды басып чыгарат. Бул акыркы сап 1-бөлүктөгү RegexDemo тиркемесинде тааныш болгон төмөнкү кадимки циклге барабар:
for (String progLang: progLangs)
   if (p.matcher(progLang).find())
      System.out.println(progLang);

Матч классынын методдору

Класстын бир мисалы класстын Matcherтүзүлгөн регулярдуу туюнтмасын чечмелөө аркылуу символдордун ырааттуулугу боюнча үлгү дал келүү операцияларын аткаруу механизмин сүрөттөйт Pattern. Класстын an objectтери Matcherүлгү издөө операцияларынын ар кандай түрлөрүн колдойт:
  • Метод boolean find()кийинки дал келүү үчүн киргизилген текстти издейт. Бул ыкма скандоону көрсөтүлгөн тексттин башында же мурунку дал келүүдөн кийинки биринчи белгиден баштайт. Экинчи параметр, эгерде бул ыкмага мурунку чалуу чын болуп, чечүүчү баштапкы абалга келтирилбесе гана мүмкүн болот. Кандай болгон күндө да, издөө ийгorктүү болсо, логикалык маани true кайтарылат. Бул ыкманын мисалын RegexDemo1-бөлүктөн тапса болот.

  • Метод boolean find(int start)дал келүүчүнү баштапкы абалга келтирет жана кийинки дал келүү үчүн текстти издейт. Көрүү параметр тарабынан көрсөтүлгөн абалдан башталат start. Издөө ийгorктүү болсо, логикалык маани true кайтарылат. Мисалы, m.find(1);позициядан баштап текстти сканерлейт 1(0 позициясы этибарга алынbyte). Эгерде параметр startтерс маанини камтыса же дал келүүчү тексттин узундугунан чоңураак маанини камтыса, ыкма өзгөчө учурду чыгарат java.lang.IndexOutOfBoundsException.

  • Метод boolean matches()бардык текстти үлгүгө дал келтирүүгө аракет кылат. Бардык текст үлгүгө дал келсе, бул логикалык маанини true кайтарат. Мисалы, 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 тorндеги кадимки туюнтмалар, 3-3-бөлүк

Аягына текст кошуу

Аягына тиркелүүчү дал келүүчүнүн абалы типтеги an objectтин аягына кошулган дал келүүчү тексттин башталышын көрсөтөт java.lang.StringBuffer. Бул позицияны төмөнкү ыкмалар колдонот:
  • Метод дал келүүчү тексттин символдорун окуйт жана аларды аргумент менен шилтеме берилген Matcher appendReplacement(StringBuffer sb, String replacement)an objectтин аягына кошот . Бул ыкма мурунку үлгү дал келүүсүнө чейинки акыркы символду окууну токтотот. Андан кийин, метод аргумент менен шилтеме берилген типтеги an objectтин символдорун an objectтин аягына кошот (сап мурунку издөө учурунда алынган текст ырааттуулугуна шилтемелерди камтышы мүмкүн; алар басып алынган символдордун жана топтун номерлеринин жардамы менен көрсөтүлөт). Акыр-аягы, ыкма акыркы дал келген белгинин ордуна кошула турган дал келүүчү позициянын маанисин орнотот жана андан кийин учурдагы дал келүүчүгө шилтеме кайтарат.StringBuffersbStringreplacementStringBufferreplacement($)

  • Эгерде дал келүүчү дал таба элек болсо же мурунку издөө аракети ишке ашпай калса, ыкма Matcher appendReplacement(StringBuffer sb, String replacement)өзгөчө учурду жаратат . Эгерде сызык үлгүдө жок басып алуу тобун көрсөтсө, java.lang.IllegalStateExceptionал өзгөчө учурду жаратат ).IndexOutOfBoundsExceptionreplacement

  • Метод StringBuffer appendTail(StringBuffer sb)бардык текстти an objectке кошуп StringBuffer, ошол an objectке шилтемени кайтарат. Акыркы ыкманы чакыргандан кийин , калган текстти an objectке көчүрүү appendReplacement(StringBuffer sb, String replacement)ыкмасын чакырыңыз .appendTail(StringBuffer sb)StringBuffer

Капталган топтор
1-бөлүктө эсиңизде болгондой, тартуу тобу - кашаа ( ) метасимволдоруна алынган символдордун ырааттуулугу (). Бул конструкциянын максаты — үлгү дал келүү учурунда табылган символдорду кийинчерээк кайра колдонуу үчүн сактоо. Үлгү издөө учурунда тартылган топтун бардык каармандары бир бүтүн катары каралат.
Төмөнкү code баштапкы тексттеги символдордун ырааттуулугунун бардык көрүнүштөрүн алмаштыруу үчүн appendReplacement(StringBuffer sb, String replacement)жана ыкмаларын чакырат : appendTail(StringBuffer sbcatcaterpillar
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 тorндеги кадимки туюнтмалар, 4-бөлүк Java тorндеги кадимки туюнтмалар, 5-бөлүк
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION