JavaRush /Java блогы /Random-KK /Java тіліндегі тұрақты өрнектер, 3-бөлім

Java тіліндегі тұрақты өрнектер, 3-бөлім

Топта жарияланған
Сіздердің назарларыңызға Джефф Фризеннің javaworld веб-сайты үшін жазған Java тіліндегі тұрақты өрнектерге арналған қысқаша нұсқаулықтың аудармасын ұсынамыз . Оқуға ыңғайлы болу үшін мақаланы бірнеше бөлікке бөлдік. Java тіліндегі тұрақты өрнектер, 3 - 1 бөлімJava тіліндегі тұрақты өрнектер, 1 бөлім Java тіліндегі тұрақты өрнектер, 2 бөлім

Regex API көмегімен жалпы бағдарламалау тапсырмаларын жеңілдетіңіз

Осы мақаланың 1 және 2 бөлімдерінде сіз тұрақты өрнектермен және Regex API интерфейсімен таныстыңыз. Сіз сынып туралы білдіңіз Patternжәне тұрақты өрнек конструкцияларын көрсететін мысалдарды араладыңыз, әріптік жолдарды пайдаланып қарапайым үлгі сәйкестендіруден ауқымдар, шекара сәйкестіктері және кванторлар арқылы күрделірек сәйкестікке дейін. Осы және келесі бөлімдерде біз бірінші бөлімде қарастырылмаған мәселелерді қарастырамыз, біз сабақтардың сәйкес әдістерін зерттейміз Patternжәне Matcher. Сондай-ақ қарапайым бағдарламалау мәселелерін жеңілдету үшін тұрақты өрнектердіPatternSyntaxException пайдаланатын екі утorтаны үйренесіз . Біріншісі құжаттама үшін codeтан түсініктемелерді шығарады. Екіншісі – лексикалық талдауды орындауға арналған қайта пайдалануға болатын code кітапханасы – ассемблерлердің, компиляторлардың және ұқсас бағдарламалық қамтамасыз етудің маңызды құрамдас бөлігі.

КӨЗ КОДЫН ЖҮКТЕП АЛУ

Осы мақаладағы демонстрациялық қолданбаларға арналған барлық бастапқы codeты (JavaWorld үшін Джефф Фризен жасаған) осы жерден ала аласыз .

Regex API үйрену

Pattern, Matcherжәне PatternSyntaxExceptionRegex API құрайтын үш сынып. Олардың әрқайсысы codeта тұрақты өрнектерді пайдалануға мүмкіндік беретін әдістерді ұсынады.

Pattern класының әдістері

Класс данасы Pattern- үлгі ретінде белгілі құрастырылған тұрақты өрнек. Үлгіні сәйкестендіру операцияларының өнімділігін жақсарту үшін тұрақты өрнектер құрастырылады. Келесі статикалық әдістер компиляцияны қолдайды.
  • Pattern compile(String regex)мазмұнды regexжаңада сақталатын аралық көрініске құрастырады Pattern. Бұл әдіс сәтті болса нысанға сілтемені қайтарады немесе PatternSyntaxExceptionжарамсыз қалыпты өрнек синтаксисі анықталса, ерекше жағдайды шығарады. MatcherОсы нысан пайдаланатын немесе одан қайтарылған сыныптың кез келген нысаны Patternөзінің әдепкі параметрлерін пайдаланады, мысалы, регистрді ескеретін іздеу. Мысал ретінде, code үзіндісі нүктелік таңбадан басталатын жолдарды сәйкестендіру үшін тұрақты өрнектің құрастырылған көрінісін сақтайтын Pattern p = Pattern.compile("(?m)^\\."); нысанды жасайды .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_LINESCASE_INSENSITIVE | DOTALLflags

  • қоспағанда 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()a түрінде құрастырылған бастапқы тұрақты өрнек жолын қайтарады Pattern.

  • int flags()нысанның жалаушаларын қайтарады Pattern.
Нысанды алғаннан кейін ол әдетте үлгіні сәйкестендіру операцияларын орындау үшін Patternнысанды алу үшін пайдаланылады . MatcherӘдіс нысан үлгісіне сәйкес мәтінді іздейтін Matcher matcher(Charsequence input)нысанды жасайды . Шақырылған кезде ол осы нысанға сілтемені қайтарады . Мысалы, пәрмен айнымалымен сілтеме жасалған нысанды қайтарады . MatcherinputPatternMatcherMatcher m = p.matcher(args[1]);MatcherPatternp
Бір реттік іздеу
static boolean matches(String regex, CharSequence input)Класс әдісі нысандарды құруға және үлгіні пайдаланып бір реттік іздеуге Patternүнемдеуге мүмкіндік береді . Бұл әдіс үлгі сәйкес келсе true мәнін қайтарады , әйтпесе ол жалған мәнін қайтарады. Тұрақты өрнекте синтаксистік қате болса, әдіс ерекше жағдайды шығарады . Мысалы, фраза тек бос орындар мен кіші әріптерден тұратынын растайтын басып шығарады .PatternMatcherinputregexPatternSyntaxExceptionSystem.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only"));trueall lowercase letters and whitespace only
Java тіліндегі тұрақты өрнектер, 3 - 2 бөлім

Мәтінді бөлу

Көптеген әзірлеушілер мәтінге негізделген қызметкер тіркелгісін өрістер жинағына түрлендіру сияқты кіріс мәтінін оның құрамдас бөліктеріне бөлу үшін кемінде бір рет жазылған codeқа ие. Сынып Patternмәтінді бөлудің екі әдісін қолдана отырып, бұл жалықтыратын тапсырманы ыңғайлырақ шешуге мүмкіндік береді:
  • Әдіс табылған сәйкестіктерге сәйкес нысан үлгісіне 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 бағдарламалау тілі атауларының тізімін жасайды, содан кейін әрпінен басталатын барлық атауларды табу үшін үлгіні құрастырады c. Жоғарыдағы codeтың соңғы жолы дереккөз ретінде осы тізіммен бірге деректердің сериялық ағынын қабылдауды жүзеге асырады. asPredicate()Ол ат әріптен басталғанда ақиқат мәнін қайтаратын cжәне ағын арқылы қайталанатын, сәйкес атауларды стандартты шығысқа басып шығаратын логикалық функцияны пайдаланып сүзгіні орнатады . Бұл соңғы жол 1-бөлімдегі RegexDemo қолданбасынан таныс келесі тұрақты циклге баламалы:
for (String progLang: progLangs)
   if (p.matcher(progLang).find())
      System.out.println(progLang);

Сәйкестендіру класының әдістері

Сынып данасы Matcherсыныптың құрастырылған тұрақты өрнекті интерпретациялау арқылы таңбалар тізбегінде үлгіні сәйкестендіру операцияларын орындау механизмін сипаттайды Pattern. Класс an objectілері Matcherүлгіні іздеу әрекеттерінің әртүрлі түрлерін қолдайды:
  • Әдіс boolean find()келесі сәйкестік үшін енгізілген мәтінді іздейді. Бұл әдіс сканерлеуді көрсетілген мәтіннің басында немесе алдыңғы сәйкестіктен кейінгі бірінші таңбадан бастайды. Екінші опция осы әдіске алдыңғы шақыру ақиқат болып қайтарылған және шешуші қалпына келтірілмеген жағдайда ғана мүмкін болады. Кез келген жағдайда, іздеу сәтті болса, логикалық мән true қайтарылады. Бұл әдістің мысалын RegexDemo1 бөлімнен табуға болады.

  • Әдіс boolean find(int start)сәйкестікті қалпына келтіреді және келесі сәйкестік үшін мәтінді іздейді. Қарау параметрмен көрсетілген орыннан басталады start. Іздеу сәтті болса, логикалық мән true қайтарылады. Мысалы, m.find(1);мәтінді позициядан бастап сканерлейді 1(0 позициясы еленбейді). Егер параметрде 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()көрсетілген мәтінді үлгімен сәйкестендіруге тырысады. Бұл әдіс мәтіннің кез келген бөлігі үлгіге сәйкес келсе, true мәнін қайтарады. Әдістен айырмашылығы matches();, барлық мәтін үлгіге сәйкес келмеуі керек. Мысалы, мәтіннің басы тек сөз құраушы таңбалардан тұратындықтан , Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());ол шығарады .trueabc!

Сынып нысандарынан айырмашылығы Pattern, сынып нысандары Matcherкүй ақпаратын сақтайды. Кейде үлгіні іздеу аяқталғаннан кейін бұл ақпаратты өшіру үшін сәйкестікті қалпына келтіру қажет болуы мүмкін. Түзеткішті қалпына келтіру үшін келесі әдістер қол жетімді:
  • Әдіс Matcher reset()сәйкестік күйін, соның ішінде соңына қосылатын орынды қалпына келтіреді (0-ге қайта орнату). Келесі үлгіні іздеу әрекеті сәйкестік мәтінінің басынан басталады. Ағымдағы нысанға сілтемені қайтарады Matcher. Мысалы, m.reset();сілтеме жасаған шешушіні қалпына келтіреді m.

  • Әдіс Matcher reset(CharSequence text)шешуші күйін қалпына келтіреді және жаңа шешуші мәтінді параметріне орнатады text. Келесі үлгіні іздеу әрекеті жаңа сәйкестік мәтінінің басынан басталады. Ағымдағы нысанға сілтемені қайтарады Matcher. Мысалы, m.reset("new text");сілтеме жасалған шешу құралын қалпына келтіреді mжәне жаңа шешуші мәтінді параметріне орнатады "new text".

Java тіліндегі тұрақты өрнектер, 3 - 3 бөлім

Мәтінді соңына қосу

Соңына қосылатын сәйкестік орны нысан нысанының соңына қосылатын сәйкестік мәтінінің басын көрсетеді java.lang.StringBuffer. Бұл позицияны келесі әдістер пайдаланады:
  • Әдіс сәйкестендіруші мәтін таңбаларын оқиды және оларды аргумент арқылы сілтеме жасалған Matcher appendReplacement(StringBuffer sb, String replacement)нысанның соңына қосады . Бұл әдіс алдыңғы үлгі сәйкестігінің алдындағы соңғы таңбада оқуды тоқтатады. Әрі қарай, әдіс аргумент арқылы сілтеме жасалған нысанның таңбаларын нысанның соңына қосады (жолда алдыңғы іздеу кезінде түсірілген мәтін тізбегіне сілтемелер болуы мүмкін; олар түсірілетін таңбалар мен топ нөмірлері арқылы көрсетіледі). Соңында, әдіс соңғы сәйкестендірілген таңбаның орнына қосылатын сәйкестік орнының мәнін орнатады және бір плюс, содан кейін ағымдағы сәйкестендірушіге сілтемені қайтарады.StringBuffersbStringreplacementStringBufferreplacement($)

  • Сәйкестендіруші әлі сәйкестікті таппаса немесе алдыңғы іздеу әрекеті сәтсіз аяқталса, әдіс Matcher appendReplacement(StringBuffer sb, String replacement)ерекше жағдайды шығарады . Егер сызық үлгіде жоқ түсіру тобын көрсетсе, java.lang.IllegalStateExceptionол ерекше жағдайды шығарады ).IndexOutOfBoundsExceptionreplacement

  • Әдіс StringBuffer appendTail(StringBuffer sb)барлық мәтінді нысанға қосады StringBufferжәне сол нысанға сілтемені қайтарады. Соңғы әдісті шақырғаннан кейін қалған мәтінді нысанға көшіру 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)сәйкестікті қалпына келтіреді, жаңа нысан жасайды String, сәйкестік мәтінінің барлық таңбаларын (бірінші сәйкестікке дейін) осы жолға көшіреді, таңбаларды оның соңына дейін қосады replacement, қалған таңбаларды жолға көшіреді және қайтарады нысан 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