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

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

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

Бірнеше ауқымды біріктіру

Бірнеше ауқымдарды қатар қою арқылы бір ауқым таңбалар класына біріктіруге болады. Мысалы, сынып [a-zA-Z]кіші немесе үлкен регистрдегі латын әліпбиінің барлық таңбаларына сәйкес келеді.

Кейіпкерлер кластарын біріктіру

Таңбалар класының бірлестігі бірнеше кірістірілген таңба сыныптарынан тұрады және нәтижелік бірлестіктегі барлық таңбаларға сәйкес келеді. Мысалы, сынып -дан -ге және -ге дейінгі [a-d[m-p]]таңбаларды сәйкестендіреді . Келесі мысалды қарастырыңыз: Бұл мысалда сәйкестіктері бар , , , және таңбалары болады : admpjava RegexDemo [ab[c-e]] abcdefabcdeabcdef
regex = [ab[c-e]]
input = abcdef
Found [a] starting at 0 and ending at 0
Found [b] starting at 1 and ending at 1
Found [c] starting at 2 and ending at 2
Found [d] starting at 3 and ending at 3
Found [e] starting at 4 and ending at 4

Таңбалар класының қиылысы

Таңбалар кластарының қиылысы барлық кірістірілген сыныптарға ортақ таңбалардан тұрады және тек жалпы таңбаларға сәйкес келеді. Мысалы, сынып , және [a-z&&[d-f]]таңбаларына сәйкес келеді . Келесі мысалды қарастырыңыз: Менің Windows операциялық жүйемде қос тырнақшалар қажет екенін ескеріңіз, себебі пәрмен қабығы оларды пәрмен бөлгіші ретінде қарастырады. Бұл мысал тек келесіге сәйкес келетін таңбаны табады : defjava RegexDemo "[aeiouy&&[y]]" party&yparty
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4

Таңбалар кластарын азайту

Шығарылатын таңба сыныптары кірістірілген таңбалар сыныптарында қамтылғандардан басқа барлық таңбалардан тұрады және тек қалған таңбаларға сәйкес келеді. Мысалы, сынып [a-z&&[^m-p]]таңбаларды -дан aжәне l-ге qдейін сәйкестендіреді z: Бұл мысалда сәйкестіктері бар java RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefg таңбаларды табады : dfabcdefg
regex = [a-f&&[^a-c]&&[^e]]
input = abcdefg
Found [d] starting at 3 and ending at 3
Found [f] starting at 5 and ending at 5

Алдын ала анықталған таңбалар кластары

Кейбір таңба сыныптары стенографиялық белгілерді қолдануды негіздеу үшін тұрақты өрнектерде жеткілікті жиі пайда болады. Класс Patternосындай қысқартулар сияқты алдын ала анықталған таңба сыныптарын ұсынады. Оларды тұрақты өрнектерді жеңілдету және синтаксистік қателерді азайту үшін пайдалануға болады. Алдын ала анықталған таңба сыныптарының бірнеше санаты бар: стандартты, POSIX java.lang.Characterжәне сценарий, блок, санат және екілік сияқты Юниcode сипаттары. Келесі тізім тек стандартты сыныптар санатын көрсетеді:
  • \d: Сан. Эквивалент [0-9].
  • \D: Сандық емес таңба. Эквивалент [^0-9].
  • \s: Бос орын таңбасы. Эквивалент [ \t\n\x0B\f\r].
  • \S: Бос орын таңбасы емес. Эквивалент [^\s].
  • \w: Сөзжасамдық таңба. Эквивалент [a-zA-Z_0-9].
  • \W: Сөзжасамдық таңба емес. Эквивалент [^\w].
Келесі мысалда \wкіріс мәтініндегі барлық сөз таңбаларын сипаттау үшін алдын ала анықталған таңбалар сыныбы қолданылады: java RegexDemo \w "aZ.8 _" Кезең және бос орын таңбалары сөз таңбалары болып саналмайтынын көрсететін келесі орындау нәтижелерін мұқият қараңыз:
regex = \w
input = aZ.8 _
Found [a] starting at 0 and ending at 0
Found [Z] starting at 1 and ending at 1
Found [8] starting at 3 and ending at 3
Found [_] starting at 5 and ending at 5
Жолды бөлгіштер
Сыныптың SDK құжаттамасы Patternнүкте метатаңбасын жолды бөлгіштерден басқа кез келген таңбаға сәйкес келетін алдын ала анықталған таңбалар класы ретінде сипаттайды (жолдың соңын белгілейтін бір немесе екі таңбалы тізбектер). Ерекшелік - нүктелер режимі (оны кейін талқылаймыз), онда нүктелер де сызық бөлгіштеріне сәйкес келеді. Класс Patternкелесі жолды бөлгіштерді ажыратады:
  • каретканы қайтару таңбасы ( \r);
  • жаңа жол таңбасы (қағазды бір жолға жылжыту белгісі) ( \n);
  • каретканы қайтару таңбасы бірден жаңа жол таңбасы ( \r\n);
  • келесі жол таңбасы ( \u0085);
  • жолды бөлгіш таңбасы ( \u2028);
  • абзацты бөлу белгісі ( \u2029)

Түсірілген топтар

Түсіру тобы үлгі бойынша іздеу кезінде әрі қарай пайдалану үшін табылған таңбалар жинағын сақтау үшін пайдаланылады. Бұл конструкция метатаңбаларға жақша ( ) арқылы алынған таңбалар тізбегі болып табылады ( ). Үлгі бойынша іздеу кезінде түсірілген топтағы барлық таңбалар бір бүтін ретінде қарастырылады. Мысалы, түсіру тобы ( ) , және Javaәріптерін бір бірлікке біріктіреді. Бұл түсіру тобы кіріс мәтініндегі үлгінің барлық көріністерін табады . Әрбір сәйкестікте алдыңғы сақталған таңбалар келесілерімен ауыстырылады. Түсірілген топтар басқа түсірілген топтардың ішіне кірістірілуі мүмкін. Мысалы, тұрақты өрнекте топ топ ішінде кірістірілген . Әрбір кірістірілген немесе кірістірілмеген түсіру тобына 1-ден басталатын нөмір тағайындалады және нөмірлеу солдан оңға қарай жүреді. Алдыңғы мысалда сәйкестіктер түсіру тобының нөмірі 1 және түсіру тобының нөмірі 2 сәйкес келеді . Тұрақты өрнекте түсіру тобының нөмірі 1 және түсіру тобының нөмірі 2 сәйкес келеді . Түсіру топтары сақтаған сәйкестіктерге кейінірек кері сілтемелер арқылы қол жеткізуге болады. Түсірілетін топтың нөміріне сәйкес келетін сандық таңбадан кейін кері қиғаш сызық таңбасы ретінде көрсетілген кері сілтеме топпен түсірілген мәтіндегі таңбаларға сілтеме жасауға мүмкіндік береді. Кері сілтеменің болуы сәйкестікті ондағы нөмірге негізделген түсірілген топтың сақталған іздеу нәтижесіне сілтеме жасайды, содан кейін одан әрі іздеу әрекеті үшін осы нәтижедегі таңбаларды пайдаланады. Келесі мысал мәтіндегі грамматикалық қателерді табу үшін кері сілтемені пайдалануды көрсетеді: Бұл мысал кіріс мәтінінде бірден кейін келетін қайталанатын сөзбен грамматикалық қатені табу үшін тұрақты өрнекті пайдаланады . Бұл тұрақты өрнек түсіру үшін екі топты көрсетеді: 1 саны – , сәйкес келетін және бос орын таңбасына сәйкес келетін саны 2 – . Артқы сілтеме №2 топтың сақталған нәтижесін қайта қарауға мүмкіндік береді, осылайша сәйкестікші бос орынның екінші рет қайталануын іздей алады , содан кейін бос орын бірінші пайда болғаннан кейін бірден және . Матчтың нәтижелері келесідей: JavaJavaJava(Java( language))(language)(Java)(Java( language))(language)(a)(b)(a)(b)Java тіліндегі тұрақты өрнектер, 2 - 2 бөлімjava RegexDemo "(Java( language)\2)" "The Java language language"(Java( language)\2)languageJava"The Java language language"(Java( language)\2)Java language language(language)language\2languagelanguageRegexDemo
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25

Шекаралық сәйкестіктер

Кейде үлгі сәйкестігін жолдың басында, сөз шекараларында, мәтіннің соңында және т.б. орындау керек. PatternМұны келесі орындарда сәйкестіктерді іздейтін тұрақты өрнек конструкциялары болып табылатын сыныптың жиегі сәйкестіктерінің бірін пайдалану арқылы жасауға болады :
  • ^: жолдың басы;
  • $: Жолдың соңы;
  • \b: Сөз шекарасы;
  • \B: псевдосөз шекарасы;
  • \A: мәтіннің басы;
  • \G: Алдыңғы матчтың соңы;
  • \Z: Мәтіннің соңы, кейінгі жолды бөлгішті қоспағанда (бар болса);
  • \z: Мәтін соңы
Келесі мысал нөл немесе одан да көп сөз таңбаларымен ^басталатын жолдарды табу үшін шекаралық сәйкестендіруші метатаңбасын пайдаланады: Таңба кіріс мәтінінің алғашқы үш таңбасының бірізді үлгі таңбаларына сәйкес келуі керектігін және кез келген санмен жалғасуы мүмкін екенін көрсетеді . сөзжасамдық белгілер. Міне, орындалу нәтижесі: Thejava RegexDemo "^The\w*" Therefore^The
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
Пәрмен жолын өзгертсеңіз не болады java RegexDemo "^The\w*" " Therefore"? ThereforeЕнгізілген мәтіннің алдында бос орын таңбасы болғандықтан сәйкестік табылмайды .

Нөлдік ұзындық сәйкес келеді

Кейде жиек сәйкестіктерімен жұмыс істегенде, ұзындығы нөлдік сәйкестіктерді кездестіресіз. Совпадение нулевой длинықұрамында ешқандай таңба жоқ сәйкестік. Олар бос енгізілген мәтінде, енгізілетін мәтіннің басында, кіріс мәтінінің соңғы символынан кейін және кіріс мәтінінің кез келген екі таңбасының арасында болуы мүмкін. Ұзындығы нөлдік сәйкестіктерді тану оңай, себебі олар әрқашан бір қалыпта басталып, аяқталады. Келесі мысалды қарастырыңыз: java RegExDemo \b\b "Java is" Бұл мысал екі дәйекті сөз шекарасын іздейді және нәтижелер келесідей болады:
regex = \b\b
input = Java is
Found [] starting at 0 and ending at -1
Found [] starting at 4 and ending at 3
Found [] starting at 5 and ending at 4
Found [] starting at 7 and ending at 6
Нәтижелерде біз бірнеше нөлдік матчтарды көреміз. Мұндағы соңғы позициялар бастапқы позициялардан бір кем, себебі RegexDemoмен 1-тізімде бастапқы codeта көрсеткенмін end() – 1. Java тіліндегі тұрақты өрнектер, 2 - 3 бөлім

Кванторлар

Квантор - үлгіні сандық мәнмен анық немесе жанама түрде байланыстыратын тұрақты өрнек конструкциясы. Бұл сандық мән үлгіні қанша рет іздеу керектігін анықтайды. Кванторлар сараң, жалқау және аса сараң болып бөлінеді:
  • Ашкөз квантор ( ?, *немесе +) ең ұзын сәйкестікті табуға арналған. Сұрасам бола ма X? бір немесе одан да көп оқиғаларды табу X, X*нөлдік немесе бірнеше көріністерді табу X, X+бір немесе бірнеше оқиғаларды табу X, оқиғаларды X{n}табу , кем дегенде (және одан да көп) оқиғаларды табу және кем дегенде , бірақ көп емес оқиғаларды табу .nXX{n,}nXX{n,m}nmX
  • Жалқау кванфикатор ( ??, *?немесе +?) ең қысқа сәйкестікті табуға арналған. , ? X??бір немесе бірнеше көріністерін іздеуді белгілей аласыз ? нөлдік немесе бірнеше оқиғаларды табу , бір немесе бірнеше көріністерді табу , оқиғаларды табу , кем дегенде (және одан да көп) оқиғаларды табу , және кем дегенде, бірақ көп емес оқиғаларды табу .XX*XX+?XX{n}?nXX{n,}?nXX{n,m}?nmX
  • Аса ашкөз кванфикатор ( ?+, *+немесе ++) ашкөз кванторға ұқсас, тек аса ашкөз квантор ең ұзын сәйкестікті табуға бір ғана әрекет жасайды, ал ашкөз квантор бірнеше әрекет жасай алады. X?+Бір немесе одан да көп оқиғаларды табу үшін X, X*+нөлдік немесе бірнеше оқиғаларды табу үшін X, X++бір немесе бірнеше оқиғаларды табу үшін X, оқиғаларды X{n}+табу үшін , кем дегенде (және одан да көп) оқиғаларды табу үшін және кем дегенде , бірақ көп емес оқиғаларды табу үшін орнатуға болады . .nXX{n,}+nXX{n,m}+ nmX
Келесі мысал ашкөз кванфикатордың қолданылуын көрсетеді: java RegexDemo .*ox "fox box pox" Міне нәтижелер:
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
Ашкөз квантор ( .*) -мен аяқталатын таңбалардың ең ұзын тізбегін табады ox. Ол бүкіл енгізілген мәтінді тұтынады, содан кейін кіріс мәтінінің осы таңбалармен аяқталатынын анықтағанша кері оралады. Енді жалқау кванторды қарастырайық: java RegexDemo .*?ox "fox box pox" Оның нәтижелері:
regex = .*?ox
input = fox box pox
Found [fox] starting at 0 and ending at 2
Found [ box] starting at 3 and ending at 6
Found [ pox] starting at 7 and ending at 10
Жалқау квантор ( .*?) -мен аяқталатын таңбалардың ең қысқа тізбегін табады ox. Ол бос жолдан басталады және сәйкестікті тапқанша бірте-бірте таңбаларды тұтынады. Содан кейін кіріс мәтіні таусылғанша жұмысын жалғастырады. Соңында, өте ашкөз кванторды қарастырайық: java RegexDemo .*+ox "fox box pox" Міне, оның нәтижелері:
regex = .*+ox
input = fox box pox
Өте ашкөз кванфикатор ( ) сәйкестіктерді таппайды, себебі ол барлық кіріс мәтінін тұтынады және тұрақты өрнектің соңында .*+сәйкес келетін ештеңе қалмайды . oxАшкөз кванфикатордан айырмашылығы, өте ашкөз квантор кері айналдырмайды.

Нөлдік ұзындық сәйкес келеді

Кейде кванторлармен жұмыс істегенде нөлдік ұзындықтағы сәйкестіктерді кездестіресіз. Мысалы, келесі сараң кванфикаторды пайдалану бірнеше нөлдік ұзындықтағы сәйкестіктерге әкеледі: java RegexDemo a? abaa Осы мысалды іске қосу нәтижелері:
regex = a?
input = abaa
Found [a] starting at 0 and ending at 0
Found [] starting at 1 and ending at 0
Found [a] starting at 2 and ending at 2
Found [a] starting at 3 and ending at 3
Found [] starting at 4 and ending at 3
Орындау нәтижелерінде бес сәйкестік бар. aБірінші, үшінші және төртінші өте күтілетін болса да (олар үш әріптің позицияларына сәйкес келеді abaa), екінші және бесінші сізді таң қалдыруы мүмкін. Олар мәтіннің соңына не aсәйкес келетінін көрсететін сияқты , бірақ іс жүзінде олай емес. bТұрақты сөз тіркесі мәтіннің соңында a?іздемейді . bОл бар немесе жоқты іздейді a. a?Ол табылмаса , aол оны нөлдік ұзындық сәйкестік ретінде хабарлайды.

Кірістірілген жалауша өрнектері

Сәйкестендірушілер қалыпты өрнекті үлгіге құрастырған кезде қайта анықталатын кейбір әдепкі жорамалдарды жасайды. Бұл мәселені кейінірек талқылаймыз. Тұрақты өрнек кірістірілген жалауша өрнегін пайдаланып әдепкі мәндердің кез келгенін қайта анықтауға мүмкіндік береді. Бұл тұрақты өрнек конструкциясы сұрақ белгісі метатаңбасының ( ?) айналасындағы жақшаның метатаңбасы ретінде көрсетіледі, одан кейін кіші латын әрпі бар. Сынып Patternкелесі кірістірілген жалауша өрнектерді түсінеді:
  • (?i): Регистрді ескермейтін үлгі сәйкестігін қосады. Мысалы, пәрменді пайдалану кезінде java RegexDemo (?i)tree Treehouseтаңбалар тізбегі Treeүлгіге сәйкес келеді tree. Әдепкі - регистрді ескеретін үлгі іздеу.
  • (?x): Үлгі ішіндегі метатаңбадан басталатын бос орын таңбаларын және түсініктемелерді пайдалануға рұқсат береді #. Сәйкестендіруші екеуін де елемейді. Мысалы, java RegexDemo ".at(?x)#match hat, cat, and so on" matterтаңбалар тізбегі үшін matүлгі сәйкес келеді .at. Әдепкі бойынша, бос орын таңбалары мен түсініктемелерге рұқсат етілмейді және сәйкестендіруші оларды іздеуге қатысатын таңбалар ретінде қарастырады.
  • (?s): нүкте метатаңбасы кез келген басқа таңбаға қосымша сызық бөлгіштеріне сәйкес келетін нүктелік режимді қосады. Мысалы, пәрмен java RegexDemo (?s). \nжаңа жол таңбасын табады. Әдепкі мәні dotall мәніне қарама-қарсы: жолды бөлгіштер табылмайды. Мысалы, пәрмен Java RegexDemo . \nжаңа жол таңбасын таба алмайды.
  • (?m)^: Әр жолдың басы мен $соңына сәйкес келетін көп жолды режимді қосады . Мысалы, java RegexDemo "(?m)^abc$" abc\nabcкіріс мәтініндегі екі ретті де табады abc. Әдепкі бойынша, бір жолды режим пайдаланылады: ^бүкіл енгізу мәтінінің басына сәйкес келеді және $оның соңына сәйкес келеді. Мысалы, java RegexDemo "^abc$" abc\nabcсәйкестіктер жоқ деген жауапты қайтарады.
  • (?u): Юниcodeқа сезімтал регистрді туралауды қосады. Бұл жалауша, -мен бірге пайдаланылғанда (?i), Юниcode стандартына сәйкес регистрді ескермейтін үлгіні сәйкестендіруге мүмкіндік береді. Әдепкі параметр тек регистрді және US-ASCII таңбаларын іздеу болып табылады.
  • (?d): Unix стиліндегі жол режимін қосады, мұнда сәйкестік мәтінмәндегі метатаңбаларды .және ^тек $жолды бөлгішті таниды \n. Әдепкі - Unix мәнері емес жол режимі: сәйкестендіруші жоғарыдағы метатаңбалар контекстінде барлық жол бөлгіштерін таниды.
Кірістірілген жалау өрнектері түсірілген топтарға ұқсайды, себебі олардың таңбалары жақша метатаңбаларымен қоршалған. Түсірілген топтардан айырмашылығы, кірістірілген жалауша өрнектері мәтін таңбаларын түсірмейтін тұрақты өрнек құрылымы болып табылатын түсірілмеген топтардың мысалы болып табылады. Олар жақшаның метатаңбаларымен қоршалған таңбалар тізбегі ретінде анықталады.
Бірнеше кірістірілген жалау өрнектерін көрсету
Тұрақты өрнекте бірнеше кірістірілген жалауша өрнектерді оларды қатар қою ( (?m)(?i))) немесе оларды ретімен анықтайтын әріптерді орналастыру ( (?mi)) арқылы көрсетуге болады.

Қорытынды

Сіз қазір түсінген боларсыз, тұрақты өрнектер өте пайдалы және олардың синтаксисінің нюанстарын меңгерген сайын пайдалырақ бола түседі. Осы уақытқа дейін мен сізді тұрақты тіркестердің негіздерімен және Pattern. Pattern2-бөлімде біз Regex API интерфейсін тереңірек қарастырамыз және , Matcherжәне әдістерін зерттейміз PatternSyntaxException. Сондай-ақ мен сізге Regex API-дің екі практикалық қосымшасын көрсетемін, оларды сіз бірден бағдарламаларыңызда пайдалана аласыз. Java тіліндегі тұрақты өрнектер, 3 бөлім Java тіліндегі тұрақты өрнектер, 4 бөлім Java тіліндегі тұрақты өрнектер, 5 бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION