Бо 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 бармегардад, танзимоти пешфарзии худро, ба монанди ҷустуҷӯи ҳассос ба ҳарфҳо истифода мебарад. Ҳамчун мисол, пораи codePattern 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)
як чизро иҷро мекунад.
Pattern
, дар баробари парчамҳои истифодашавандаи он гирифта шавад. Барои ин, шумо метавонед усулҳои зеринро даъват кунед:
String pattern()
сатри аслии ифодаи муқаррариро, ки баPattern
.int flags()
парчамҳои an objectро бармегардонадPattern
.
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]);
бармегардад , ки аз ҷониби тағирёбанда истинод шудааст . Matcher
Pattern
p
Ҷустуҷӯи яквақта |
---|
Усули 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 танҳо фосила ва аломатҳои хурд дорад. |
Тақсимоти матн
Аксарияти таҳиягарон ҳадди аққал як маротиба 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]);
Рамзи дар боло зикршуда ифодаи муқаррариро барои пайдо кардани аломати вергул ва пас аз як аломати фосила тавсиф мекунад. Дар ин ҷо натиҷаҳои иҷрои он ҳастанд:
John Doe
47
Hillsboro Road
32000
Предикатҳои шаблон ва API Streams
Дар Java 8Pattern
методе дар синф пайдо шуд . Ин усул предикат (функсия бо арзиши мантиқӣ) эҷод мекунад, ки барои мувофиқ кардани намуна истифода мешавад. Истифодаи ин усул дар пораи 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()
кӯшиш мекунад, ки тамоми матнро бо намуна мувофиқ созад. Он арзиши мантиқии ҳақиқиро бармегардонад, агар ҳамаи матн ба намуна мувофиқат кунад. Масалан, 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иStringBuffer
бо аргумент истинодшуда замима мекунадsb
. Ин усул хонданро дар аломати охирини пеш аз мувофиқати намунаи қаблӣ қатъ мекунад. Минбаъд, усул аломатҳои an objectи навъиString
бо аргумент истинодшавандароreplacement
ба охири an object замима мекунадStringBuffer
(сатрreplacement
метавонад истинодҳоро ба пайдарпайии матни ҳангоми ҷустуҷӯи қаблӣ гирифташуда дошта бошад; онҳо бо истифода аз аломатҳо($)
ва рақамҳои гурӯҳи забтшуда муайян карда мешаванд). Ниҳоят, усул арзиши мавқеи мувофиқро барои замима ба мавқеи аломати мувофиқи охирин бо иловаи як муқаррар мекунад ва сипас истинодро ба мувофиқати ҷорӣ бармегардонад. -
Усул
StringBuffer appendTail(StringBuffer sb)
тамоми матнро ба an object илова мекунадStringBuffer
ва истинодро ба он an object бармегардонад. Пас аз занги усули охиринappendReplacement(StringBuffer sb, String replacement)
, методроappendTail(StringBuffer sb)
барои нусхабардории матни боқимонда ба an object даъват кунед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, Қисми 4 Ифодаҳои муқаррарӣ дар Java, Қисми 5
GO TO FULL VERSION