Ифодаи муқаррарии RegEx чист?
Дар асл, ифодаи муқаррарӣ (RegEx дар Java) намунаи ҷустуҷӯи сатр дар матн аст. Дар Java тасвири ибтидоии ин намуна ҳамеша сатр, яъне an objectи синфи String мебошад. Аммо, ягон сатрро ба ифодаи муқаррарӣ ҷамъ овардан мумкин нест, танҳо онҳое, ки қоидаҳои навиштани ифодаи муқаррариро риоя мекунанд - синтаксиси дар мушаххасоти забон муайяншуда. Барои навиштани ибораи муқаррарӣ аломатҳои алифбоӣ ва ададӣ, инчунин метаҳарфаҳо – аломатҳое истифода мешаванд, ки дар синтаксиси ибораҳои муқаррарӣ маънои махсус доранд. Барои намуна:String regex = "java"; // string template "java";
String regex = "\\d{3}"; // string template of three numeric characters;
Эҷоди ифодаҳои муқаррарӣ дар Java
Барои сохтани RegEx дар Java, шумо бояд ду қадами оддиро иҷро кунед:- онро ҳамчун сатр бо истифода аз синтаксиси ифодаи муқаррарӣ нависед;
- ин сатрро ба ифодаи муқаррарӣ тартиб диҳед;
Pattern
. Барои ин ба шумо лозим аст, ки яке аз ду усули статикиро, ки дар синф мавҷуд аст, даъват кунед compile
. Усули аввал як аргумент мегирад - як сатри литерали ифодаи муқаррарӣ ва дуюм - иловаи параметри дигаре, ки режими муқоисаи қолабро бо матн фаъол мекунад:
public static Pattern compile (String literal)
public static Pattern compile (String literal, int flags)
Рӯйхати арзишҳои имконпазири параметр flags
дар синф муайян карда шудааст Pattern
ва барои мо ҳамчун тағирёбандаҳои синфи статикӣ дастрас аст. Барои намуна:
Pattern pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//searching for matches with the pattern will be done case-insensitively.
Аслан, синф Pattern
як созандаи ифодаи муқаррарӣ мебошад. Дар зери сарпӯш, метод compile
конструктори хусусии синфро даъват мекунад Pattern
, то намуди тартибдодашударо эҷод кунад. Ин усули эҷоди намунаи қолабӣ бо мақсади эҷоди он ҳамчун an objectи тағирнопазир амалӣ карда мешавад. Ҳангоми эҷод, санҷиши синтаксиси ифодаи муқаррарӣ анҷом дода мешавад. Агар дар сатр хатогӣ мавҷуд бошад, истисно тавлид мешавад PatternSyntaxException
.
Синтаксиси ифодаи муқаррарӣ
Синтаксиси ифодаи муқаррарӣ ба истифодаи аломатҳо асос ёфтааст<([{\^-=$!|]})?*+.>
, ки онҳоро бо аломатҳои алифбоӣ якҷоя кардан мумкин аст. Вобаста аз нақши онҳо, онҳоро ба якчанд гурӯҳ тақсим кардан мумкин аст:
МетаHowтер | Мақсад |
---|---|
^ | оғози хат |
$ | охири сатр |
\б | сарҳади калима |
\Б | маҳдудияти калима нест |
\А | оғози воридшавӣ |
\Г | охири бозии қаблӣ |
\З | охири вуруд |
\з | охири вуруд |
МетаHowтер | Мақсад |
---|---|
\д | рамзи рақамӣ |
\Д | аломати ғайрирақамӣ |
\с | хусусияти фазой |
\С | аломати холии бефосила |
\w | аломати алифбои рақамӣ ё зерхат |
\ В | ҳар гуна аломати ғайр аз алифбо, рақамӣ ё зерхат |
. | ягон характер |
МетаHowтер | Мақсад |
---|---|
\т | аломати ҷадвал |
\n | аломати сатри нав |
\р | аломати бозгашти вагон |
\ф | ба саҳифаи нав гузаред |
\u0085 | аломати сатри оянда |
\ у 2028 | аломати ҷудокунандаи хат |
\ у 2029 | аломати ҷудокунандаи параграф |
МетаHowтер | Мақсад |
---|---|
[a B C] | ҳар яке аз боло (a, b, ё c) |
[^abc] | ҳар чизи дигаре, ки дар рӯйхат оварда шудаанд (на a, b, c) |
[a-zA-Z] | якҷояшавии диапазон (ҳарфҳои лотинӣ аз a то z ба ҳарфҳо ҳассос нестанд) |
[ad[mp]] | пайванди аломатҳо (а то d ва м ба p) |
[az&&[def]] | чорроҳаи рамзҳо (рамзҳои d, e, f) |
[az&&[^bc]] | кам кардани аломатҳо (аломатҳои a, dz) |
МетаHowтер | Мақсад |
---|---|
? | як ё бедарак |
* | сифр ё бештар маротиба |
+ | як ё якчанд маротиба |
{н} | n маротиба |
{н,} | n маротиба ё бештар |
{н,м} | на камтар аз n маротиба ва на бештар аз m маротиба |
Ҳолати миқдорбандии хасис
Хусусияти махсуси миқдорҳо қобorяти истифода бурдани онҳо дар шеваҳои гуногун аст: тамаъкорӣ, фавқулода ва танбалӣ. Ҳолати изофаи тамаъкорӣ бо илова кардани аломати "+
" пас аз миқдор ва ҳолати танбалӣ бо илова кардани аломати " ?
" фаъол карда мешавад. Барои намуна:
"A.+a" // greedy mode
"A.++a" // over-greedy mode
"A.+?a" // lazy mode
Бо истифода аз ин қолаб ҳамчун намуна, биёед бифаҳмем, ки миқдорҳо дар режимҳои гуногун чӣ гуна кор мекунанд. Бо нобаёнӣ, миқдор дар ҳолати тамаъкорӣ кор мекунад. Ин маънои онро дорад, ки он дарозтарин мувофиқати имконпазирро дар сатр меҷӯяд. Дар натиҷаи иҷро кардани ин code:
public static void main(String[] args) {
String text = "Egor Alla Alexander";
Pattern pattern = Pattern.compile("A.+a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(text.substring(matcher.start(), matcher.end()));
}
}
мо натиҷаи зеринро ба даст меорем: Alla Alexa Алгоритми ҷустуҷӯ барои намунаи додашуда " А.+а
" бо пайдарпаии зерин иҷро карда мешавад:
-
Дар намунаи додашуда аломати аввал ҳарфи русӣ аст
А
.Matcher
онро бо ҳар аломати матн, аз мавқеи сифр сар карда, мувофиқат мекунад. Дар мавқеъи сифр дар матни мо аломат мавҷуд астЕ
, бинобар ин,Matcher
он аломатҳои матнро пай дар пай мегузарад, то он даме, ки он ба мувофиқат бо намуна мувофиқат кунад. Дар мисоли мо ин рамз дар мавқеи № 5 аст. -
Пас аз пайдо шудани мувофиқат бо аломати якуми нақш,
Matcher
он мувофиқатро бо аломати дуюми нақш тафтиш мекунад. Дар ҳолати мо, ин аломати ".
", ки ҳар як аломатро ифода мекунад.Дар мавқеи шашум рамзи ҳарф аст
л
. Албатта, он ба намунаи "ҳар гуна аломат" мувофиқат мекунад. -
Matcher
ба тафтиши аломати навбатӣ аз намуна мегузарад. Дар қолаби мо, он бо истифода аз.+
миқдори муайянкунандаи " " муайян карда шудааст. Азбаски шумораи такрори «ягон аломат» дар қолаб як ё якчанд маротиба аст,Matcher
он бо навбат аломати навбатиро аз сатр мегирад ва мувофиқати онро ба намуна месанҷад, то он даме, ки шарти «ягон аломат» иҷро карда шавад. дар мисоли мо — то охири сатр (аз мавкеи No 7 — раками 18 матн).Дарвоқеъ,
Matcher
он тамоми хатро то ба охир мегирад - дар ин ҷо "тамаъ" -и он зоҳир мешавад. -
Пас аз
Matcher
расидан ба охири матн ва анҷом додани тафтишиА.+
қисми “ ” намуна, Матчер ба тафтиши боқимондаи намуна - аломати ҳарф оғоз мекунада
. Азбаски матн дар самти пеш ба охир расид, чек аз аломати охирин сар карда, дар самти баръакс сурат мегирад: -
Matcher
Миқдори такрорҳоро дар қолаби ".+
"ба хотир меорад, ки дар он ба охири матн расида буд, аз ин рӯ шумораи такрорҳоро як маротиба кам мекунад ва намунаи матнро то пайдо шудани мувофиқат тафтиш мекунад:
Ҳолати миқдордиҳандаи ултра-тамаъкор
Дар реҷаи хеле тамаъкор, гӯгирд ба механизми режими хасис монанд кор мекунад. Фарқият дар он аст, ки вақте ки шумо матнро то охири сатр мегиред, ҷустуҷӯ ба ақиб нест. Ин аст, ки се марҳилаи аввал дар ҳолати супер-тамаъкорӣ ба режими хасис монанд хоҳанд буд. Пас аз гирифтани тамоми сатр, мувофиқкунанда қисми боқимондаи намунаро илова мекунад ва онро бо сатри гирифташуда муқоиса мекунад. Дар мисоли мо, ҳангоми иҷрои усули асосӣ бо намунаи "А.++а
", ҳеҷ гуна мувофиқат пайдо намешавад.
Ҳолати танбали миқдор
-
Дар ин реҷа, дар марҳилаи ибтидоӣ, ба мисли режими хасис, мувофиқат бо аломати якуми намуна ҷустуҷӯ карда мешавад:
-
Баъдан, он мувофиқатро бо аломати навбатии намуна ҷустуҷӯ мекунад - ҳар гуна аломат:
-
Баръакси режими тамаъкорӣ, режими танбалӣ мувофиқати кӯтоҳтаринро дар матн ҷустуҷӯ мекунад, бинобар ин пас аз дарёфти мувофиқат бо аломати дуюми намуна, ки бо нуқта нишон дода шудааст ва бо аломати мавқеи № 6 матн мувофиқат мекунад, он мувофиқат мекунад.
Matcher
тафтиш мекунад, ки оё матн ба боқимондаи намуна - аломати “а
” мувофиқат мекунад. -
Азбаски мувофиқат бо намунаи матн пайдо нашудааст (дар мавқеъи № 7 дар матн аломати “
л
“ мавҷуд аст),Matcher
он дар қолаби дигар “ҳар гуна аломат”-ро илова мекунад, зеро он як ё якчанд маротиба нишон дода шудааст, ва боз намунаро бо матни мавқеъҳои аз № 5 то 8 муқоиса мекунад: -
Дар мо бошад, як гугирд ёфт шуд, вале ба охири матн хануз нарасидааст. Аз ин рӯ, аз мавқеъи № 9 санҷиш аз ҷустуҷӯи аломати якуми намуна бо истифода аз алгоритми шабеҳ оғоз мешавад ва сипас то охири матн такрор мешавад.
main
ҳангоми истифодаи А.+?а
қолаби " ", мо натиҷаи зеринро ба даст меорем: Алла Alexa Тавре ки аз мисоли мо дида мешавад, ҳангоми истифодаи режимҳои миқдор барои як қолаб, мо натиҷаҳои гуногун ба даст овардем. Аз ин рӯ, зарур аст, ки ин хусусиятро ба назар гирифта, вобаста ба натиҷаи дилхоҳ ҳангоми ҷустуҷӯ режими дилхоҳро интихоб кунед.
Фирор кардани аломатҳо дар ибораҳои муқаррарӣ
Азбаски ифодаи муқаррарӣ дар Java, ё дақиқтараш муаррифии ибтидоии он, бо истифода аз сатри литерали муайян карда мешавад, бояд қоидаҳои мушаххасоти Java, ки ба литералҳои сатр алоқаманданд, ба назар гирифта шаванд. Аз ҷумла, аломати баръакси хат "\
" дар сатри литералӣ дар codeи ибтидоии Java ҳамчун аломати фирор тафсир карда мешавад, ки компиляторро огоҳ мекунад, ки аломати пас аз он аломати махсус аст ва бояд ба таври махсус тафсир карда шавад. Барои намуна:
String s = "The root directory is \nWindows";//wrap Windows to a new line
String s = "The root directory is \u00A7Windows";//insert paragraph character before Windows
Аз ин рӯ, дар сатри литералҳо, ки ифодаи муқаррариро тавсиф мекунанд ва \
аломати " " -ро истифода мебаранд (масалан, барои мета аломатҳо), он бояд дучанд карда шавад , то компилятори bytecodeи Java онро ба таври дигар тафсир накунад. Барои намуна:
String regex = "\\s"; // template for searching for space characters
String regex = "\"Windows\""; // pattern to search for the string "Windows"
Агар мо нақшаи онҳоро ҳамчун аломатҳои "муқаррарӣ" истифода барем, аломати бозгашти дукарата низ бояд барои гурехтани аломатҳои махсус истифода шавад. Барои намуна:
String regex = "How\\?"; // template for searching the string "How?"
Усулҳои синфи Pattern
СинфPattern
усулҳои дигари кор бо ибораҳои муқаррариро дорад: String pattern()
– тасвири сатри аслии ифодаи муқаррариро, ки аз он an object сохта шудааст, бармегардонад Pattern
:
Pattern pattern = Pattern.compile("abc");
System.out.println(Pattern.pattern())//"abc"
static boolean matches(String regex, CharSequence input)
– ба шумо имкон медиҳад, ки ифодаи муқаррарии дар параметри regex додашударо нисбат ба матни дар параметр гузаронидашуда тафтиш кунед input
. Бозмегардонад: ҳақиқӣ – агар матн ба намуна мувофиқат кунад; бардурӯғ - дар акси ҳол; Мисол:
System.out.println(Pattern.matches("A.+a","Alla"));//true
System.out.println(Pattern.matches("A.+a","Egor Alla Alexander"));//false
int flags()
– flags
арзишҳои параметри шаблонро, ки ҳангоми сохтани он муқаррар шуда буданд, бармегардонад ё 0 агар ин параметр муқаррар нашуда бошад. Мисол:
Pattern pattern = Pattern.compile("abc");
System.out.println(pattern.flags());// 0
Pattern pattern = Pattern.compile("abc",Pattern.CASE_INSENSITIVE);
System.out.println(pattern.flags());// 2
String[] split(CharSequence text, int limit)
– матни ҳамчун параметр додашударо ба массиви элементҳо тақсим мекунад String
. Параметр limit
шумораи максималии мувофиқатҳоеро, ки дар матн ҷустуҷӯ мешаванд, муайян мекунад:
- кай
limit>0
– ҷустуҷӯиlimit-1
мувофиқат анҷом дода мешавад; - дар
limit<0
- ҳамаи мувофиқатҳоро дар матн ҷустуҷӯ мекунад - вақте
limit=0
– ҳамаи мувофиқатҳоро дар матн ҷустуҷӯ мекунад, дар ҳоле ки сатрҳои холӣ дар охири массив хориҷ карда мешаванд;
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("\\s");
String[] strings = pattern.split(text,2);
for (String s : strings) {
System.out.println(s);
}
System.out.println("---------");
String[] strings1 = pattern.split(text);
for (String s : strings1) {
System.out.println(s);
}
}
Натиҷаи консол: Егор Алла Анна -------- Егор Алла Анна Мо дар зер усули дигари синфро барои сохтани an object дида мебароем Matcher
.
Усулҳои синфи мувофиқ
Matcher
синфест, ки аз он an object барои ҷустуҷӯи намунаҳо сохта мешавад. Matcher
– ин «муҳаррики ҷустуҷӯ», «муҳаррик»-и ибораҳои муқаррарӣ мебошад. Барои ҷустуҷӯ ба ӯ ду чизро додан лозим аст: намунаи ҷустуҷӯ ва "суроға" барои ҷустуҷӯ. Барои сохтани an object, Matcher
усули зерин дар синф пешбинӣ шудааст Pattern
: рublic Matcher matcher(CharSequence input)
Ҳамчун аргумент, усул пайдарпайии аломатҳоро мегирад, ки дар он ҷустуҷӯ анҷом дода мешавад. Инҳо an objectҳои синфҳо мебошанд, ки интерфейсро амалӣ мекунанд CharSequence
. String
Шумо метавонед на танҳо , балки StringBuffer
, StringBuilder
, Segment
ва ҳамчун далел гузаред CharBuffer
. Шаблони ҷустуҷӯ an objectи синфест, Pattern
ки дар он метод номида мешавад matcher
. Намунаи сохтани мувофиқ:
Pattern p = Pattern.compile("a*b");// compiled the regular expression into a view
Matcher m = p.matcher("aaaaab");//created a search engine in the text “aaaaab” using the pattern "a*b"
Акнун бо ёрии «муҳаррики ҷустуҷӯ»-и худ мо метавонем мувофиқатҳоро ҷустуҷӯ кунем, мавқеъи мувофиқатро дар матн фаҳмем ва матнро бо истифода аз усулҳои синф иваз кунем. Усул boolean find()
мувофиқати навбатиро дар матн бо намуна ҷустуҷӯ мекунад. Бо истифода аз ин усул ва оператори даврӣ шумо метавонед тамоми матнро мувофиқи модели рӯйдодҳо таҳлил кунед (амалҳои заруриро ҳангоми рух додани ҳодиса - дарёфти мувофиқат дар матн иҷро кунед). Масалан, бо истифода аз усулҳои ин синф int start()
шумо int end()
метавонед мавқеъҳои мувофиқатро дар матн муайян кунед ва бо истифода аз усулҳо мувофиқатҳоро дар матн бо матни ивазкунандаи дигар иваз кунед String replaceFirst(String replacement)
. String replaceAll(String replacement)
Мисол:
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("A.+?a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start=matcher.start();
int end=matcher.end();
System.out.println("Match found" + text.substring(start,end) + " с "+ start + " By " + (end-1) + "position");
}
System.out.println(matcher.replaceFirst("Ira"));
System.out.println(matcher.replaceAll("Olga"));
System.out.println(text);
}
Баромади барнома: Гугирд ёфт шуд Алла аз 5 то 8 мавқеъ Гугирд ёфт шуд Анна аз 10 то 13 мавқеъ Егор Ира Анна Егор Ольга Ольга Егор Алла Анна Аз мисол маълум мешавад, ки усулҳо an objectи нав - сатрро replaceFirst
ба вуҷуд меоранд . матни сарчашмаест, ки дар он мувофиқат бо қолаб бо матне, ки ба усул ҳамчун аргумент интиқол дода мешавад, иваз карда мешавад. Гузашта аз ин, усули иваз танҳо бозии аввал, ва ҳамаи бозиҳои дар санҷиш. Матни аслӣ бетағйир боқӣ мемонад. Истифодаи усулҳои дигари синфӣ , инчунин намунаҳои ибораҳои муқаррариро дар ин силсила мақолаҳо дидан мумкин аст . Амалҳои маъмултарин бо ибораҳои муқаррарӣ ҳангоми кор бо матн аз синфҳо мебошанд ва дар . Инҳо усулҳое мебошанд, ки , , , . Аммо дар асл, "зери кулоҳ" онҳо аз ва . Аз ин рӯ, агар ба шумо лозим ояд, ки матнро иваз кунед ё сатрҳоро дар барнома бидуни навиштани codeи нолозим муқоиса кунед, аз усулҳои . Агар ба шумо қобorятҳои пешрафта лозим бошад, дар бораи синфҳо ва . replaceAll
String
replaceFirst
replaceAll
Matcher
Pattern
Matcher
String
split
matches
replaceFirst
replaceAll
Pattern
Matcher
String
Pattern
Matcher
Хулоса
Ифодаи муқаррарӣ дар барномаи Java бо истифода аз сатрҳое тасвир шудааст, ки ба намунаи муқаррарнамудаи қоидаҳо мувофиқат мекунанд. Вақте ки code кор мекунад, Java ин сатрро ба an objectи синф дубора тартиб медиҳадPattern
ва an objectи синфро Matcher
барои ёфтани мувофиқат дар матн истифода мебарад. Тавре ки дар аввал гуфтам, ибораҳои муқаррарӣ аксар вақт барои баъдӣ як сӯ гузошта мешаванд, ки мавзӯи душвор ҳисобида мешаванд. Аммо, агар шумо асосҳои синтаксис, мета аломатҳо, фирорро фаҳмед ва мисолҳои ибораҳои муқаррариро омӯзед, онҳо назар ба он ки дар назари аввал ба назар мерасанд, хеле соддатар мешаванд.
GO TO FULL VERSION