Regex API менен жалпы программалоо тапшырмаларын жөнөкөйлөштүрүү
Бул макаланын 1 жана 2-бөлүктөрүндө сиз кадимки туюнтмалар жана Regex API менен тааныштыңыз. Сиз класс менен таанышыпPattern
, кадимки саптарды колдонуу менен жөнөкөй үлгү дал келүүсүнөн диапазондорду, чек араларды жана сандык көрсөткүчтөрдү колдонуу менен татаалыраак дал келүүгө чейин кадимки туюнтма түзүмдөрүн көрсөткөн мисалдарды карап чыктыңыз. Ушул жана кийинки бөлүмдөрдө биз биринчи бөлүктө каралбаган маселелерди карап чыгабыз, класстардын тиешелүү ыкмаларын Pattern
жана Matcher
. Сиз ошондой эле жалпы программалоо көйгөйлөрүн жеңилдетүү үчүн кадимки сөз айкаштарынPatternSyntaxException
колдонгон эки утorтаны үйрөнөсүз . Биринчиси documentация үчүн codeдон комментарийлерди чыгарат. Экинчиси - лексикалык анализ жүргүзүү үчүн иштелип чыккан көп жолу колдонулуучу codeдун китепканасы - ассемблерлердин, компиляторлордун жана ушул сыяктуу программалык камсыздоонун маанилүү компоненти.
БУЛАК КОДУН ЖҮКТӨП АЛУУ
Бул макаладагы демо тиркемелер үчүн бардык баштапкы codeду (JavaWorld үчүн Джефф Фризен тарабынан түзүлгөн) бул жерден ала аласыз .Regex API үйрөнүү
Pattern
, Matcher
жана PatternSyntaxException
Regex 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_LINES
CASE_INSENSITIVE | DOTALL
flags
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)
бир эле нерсени жасайт.
Pattern
, ал колдонгон желектер менен бирге алуу керек болот. Бул үчүн, сиз төмөнкү ыкмаларды чакыра аласыз:
String pattern()
ге түзүлгөн баштапкы регулярдуу туюнтма сапты кайтаратPattern
.int flags()
an objectтин желектерин кайтаратPattern
.
Pattern
an objectти алуу үчүн колдонулат . Matcher
Метод an object үлгүсүнө дал келген текстти издеген Matcher matcher(Charsequence input)
an objectти түзөт . Чакырганда, бул an objectке шилтеме кайтарат . Мисалы, буйрук өзгөрмө шилтеме кылган an object үчүн кайтарат . Matcher
input
Pattern
Matcher
Matcher m = p.matcher(args[1]);
Matcher
Pattern
p
Бир жолку издөө |
---|
static boolean matches(String regex, CharSequence input) Класс ыкмасы an objectтерди түзүүдө жана шаблон аркылуу бир жолку издөөдө Pattern үнөмдөөгө мүмкүндүк берет . Бул ыкма үлгү дал келсе true кайтарат , антпесе ал жалган кайтарат. Эгерде кадимки туюнтма синтаксистик катаны камтыса, ыкма өзгөчө учурду жаратат . Мисалы, фраза боштуктарды жана кичине тамгаларды гана камтыганын ырастап басып чыгарат .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 |
Текстти бөлүү
Көпчүлүк иштеп чыгуучулардын, жок эле дегенде, бир жолу жазылган codeу бар, мисалы, текстке негизделген кызматкер эсебин талаалардын жыйындысына айландыруу сыяктуу, киргизүү текстин анын компоненттерине бөлүү. КлассPattern
бул тажатма тапшырманы эки текстти бөлүү ыкмасын колдонуу менен оңой чечүүгө мүмкүнчүлүк берет:
-
Метод an object үлгүсүнө табылган дал келүүлөргө жараша
String[] split(CharSequence text, int limit)
бөлүнөт жана натыйжаларды массивде кайтарат. Ар бир массив элементи кийинки ырааттуулуктан үлгүгө дал келген текст фрагменти (же тексттин аягы) менен бөлүнгөн текст ырааттуулугун аныктайт. Массивдин элементтери кандай тартипте пайда болсо, ошол эле тартипте болот .text
Pattern
text
Бул ыкмада массив элементтеринин саны параметрге жараша болот
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 кайтарылат. Бул ыкманын мисалынRegexDemo
1-бөлүктөн тапса болот. -
Метод
boolean find(int start)
дал келүүчүнү баштапкы абалга келтирет жана кийинки дал келүү үчүн текстти издейт. Көрүү параметр тарабынан көрсөтүлгөн абалдан башталатstart
. Издөө ийгorктүү болсо, логикалык маани true кайтарылат. Мисалы,m.find(1);
позициядан баштап текстти сканерлейт1
(0 позициясы этибарга алынbyte). Эгерде параметрstart
терс маанини камтыса же дал келүүчү тексттин узундугунан чоңураак маанини камтыса, ыкма өзгөчө учурду чыгаратjava.lang.IndexOutOfBoundsException
. -
Метод
boolean matches()
бардык текстти үлгүгө дал келтирүүгө аракет кылат. Бардык текст үлгүгө дал келсе, бул логикалык маанини true кайтарат. Мисалы, codePattern 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!
сөз түзүүчү символдордон гана турат.
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"
.
Аягына текст кошуу
Аягына тиркелүүчү дал келүүчүнүн абалы типтеги an objectтин аягына кошулган дал келүүчү тексттин башталышын көрсөтөтjava.lang.StringBuffer
. Бул позицияны төмөнкү ыкмалар колдонот:
-
Метод дал келүүчү тексттин символдорун окуйт жана аларды аргумент менен шилтеме берилген
Matcher appendReplacement(StringBuffer sb, String replacement)
an objectтин аягына кошот . Бул ыкма мурунку үлгү дал келүүсүнө чейинки акыркы символду окууну токтотот. Андан кийин, метод аргумент менен шилтеме берилген типтеги an objectтин символдорун an objectтин аягына кошот (сап мурунку издөө учурунда алынган текст ырааттуулугуна шилтемелерди камтышы мүмкүн; алар басып алынган символдордун жана топтун номерлеринин жардамы менен көрсөтүлөт). Акыр-аягы, ыкма акыркы дал келген белгинин ордуна кошула турган дал келүүчү позициянын маанисин орнотот жана андан кийин учурдагы дал келүүчүгө шилтеме кайтарат.StringBuffer
sb
String
replacement
StringBuffer
replacement
($)
-
Метод
StringBuffer appendTail(StringBuffer sb)
бардык текстти an objectке кошупStringBuffer
, ошол an objectке шилтемени кайтарат. Акыркы ыкманы чакыргандан кийин , калган текстти an objectке көчүрүүappendReplacement(StringBuffer sb, String replacement)
ыкмасын чакырыңыз .appendTail(StringBuffer sb)
StringBuffer
Эгерде дал келүүчү дал таба элек болсо же мурунку издөө аракети ишке ашпай калса, ыкма Matcher appendReplacement(StringBuffer sb, String replacement)
өзгөчө учурду жаратат . Эгерде сызык үлгүдө жок басып алуу тобун көрсөтсө, java.lang.IllegalStateException
ал өзгөчө учурду жаратат ).IndexOutOfBoundsException
replacement
Капталган топтор |
---|
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 objectString
(сап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-бөлүк
GO TO FULL VERSION