RegEx тұрақты өрнек дегеніміз не?
Шын мәнінде, тұрақты өрнек (Java тіліндегі RegEx) мәтіндегі жолды іздеуге арналған үлгі болып табылады. Java тілінде бұл үлгінің бастапқы көрінісі әрқашан жол, яғни String класының an objectісі болып табылады. Дегенмен, кез келген жолды тұрақты өрнекке құрастыруға болмайды, тек тұрақты өрнек жазу ережелерін сақтайтындар – тіл спецификациясында анықталған синтаксис. Тұрақты сөз тіркесін жазу үшін алфавиттік және сандық таңбалар, сонымен қатар тұрақты тіркестердің синтаксисіндегі ерекше мағынаға ие болатын метатаңбалар – символдар қолданылады. Мысалы:String regex = "java"; // string template "java";
String regex = "\\d{3}"; // string template of three numeric characters;
Java тілінде тұрақты өрнектерді құру
Java тілінде RegEx жасау үшін екі қарапайым қадамды орындау керек:- оны тұрақты өрнек синтаксисін пайдаланып жол ретінде жазу;
- бұл жолды тұрақты өрнекке құрастыру;
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
Үлгі данасын жасаудың бұл әдісі оны өзгермейтін нысан ретінде жасау мақсатымен жүзеге асырылады. Құру кезінде тұрақты өрнектің синтаксистік тексеруі орындалады. Жолда қателер болса, ерекше жағдай жасалады PatternSyntaxException
.
Тұрақты өрнек синтаксисі
<([{\^-=$!|]})?*+.>
Тұрақты өрнек синтаксисі алфавиттік таңбалармен біріктірілуі мүмкін белгілерді пайдалануға негізделген . Олардың рөліне қарай оларды бірнеше топқа бөлуге болады:
Метатаңба | Мақсат |
---|---|
^ | жолдың басы |
$ | жолдың соңы |
\b | сөз шекарасы |
\B | сөздің шегі емес |
\А | енгізудің басталуы |
\Г | алдыңғы матчтың соңы |
\З | енгізудің соңы |
\z | енгізудің соңы |
Метатаңба | Мақсат |
---|---|
\d | сандық таңба |
\D | сандық емес таңба |
\s | кеңістік сипаты |
\С | бос орынсыз таңба |
\w | әріптік-сандық таңба немесе астын сызу |
\В | алфавиттік, сандық немесе астын сызудан басқа кез келген таңба |
. | кез келген кейіпкер |
Метатаңба | Мақсат |
---|---|
\t | қойынды таңбасы |
\n | жаңа жол таңбасы |
\r | каретканы қайтару сипаты |
\f | жаңа бетке өтіңіз |
\u0085 | келесі жол символы |
\u 2028 | жолды бөлгіш таңба |
\u 2029 | абзацты бөлу белгісі |
Метатаңба | Мақсат |
---|---|
[a B C] | жоғарыда аталғандардың кез келгені (a, b немесе c) |
[^abc] | аталғандардан басқа кез келген (a, b, c емес) |
[a-zA-Z] | диапазонды біріктіру (латын әріптері a және z әріптерін ескермейді) |
[жарнама[mp]] | таңбаларды біріктіру (a-d және м-ден p) |
[az&&[def]] | таңбалардың қиылысуы (d,e,f символдары) |
[az&&[^bc]] | таңбаларды алу (a, dz таңбалары) |
Метатаңба | Мақсат |
---|---|
? | біреуі немесе жоқ |
* | нөл немесе одан да көп рет |
+ | бір немесе бірнеше рет |
{n} | n рет |
{n,} | n рет немесе одан да көп |
{n,м} | n есе кем емес және m есе көп емес |
Ашкөз кванфикатор режимі
Кванторлардың ерекше ерекшелігі - оларды әртүрлі режимдерде қолдану мүмкіндігі: ашкөз, өте ашкөз және жалқау. Қосымша сараңдық режимі+
квантордан кейін « » таңбасын қосу арқылы және жалқау режимі « » таңбасын қосу арқылы қосылады ?
. Мысалы:
"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 - No 18 позициясынан).Шындығында,
Matcher
ол бүкіл сызықты соңына дейін түсіреді - дәл осы жерде оның «ашкөздігі» көрінеді. -
Matcher
Мәтіннің соңына жеткеннен кейін жәнеА.+
үлгінің “ ” бөлігін тексеруді аяқтағаннан кейін, Матчер үлгінің қалған бөлігін – әріп таңбасын тексеруді бастайдыа
. Алға бағыттағы мәтін аяқталғандықтан, тексеру соңғы таңбадан бастап кері бағытта жүреді: -
Matcher
.+
Мәтіннің соңына жеткен " " үлгісіндегі қайталаулар санын "есте сақтайды ", сондықтан қайталау санын бір-бірге азайтады және сәйкестік табылғанша мәтін үлгісін тексереді:
Өте ашкөз кванфикатор режимі
Өте ашкөз режимде сәйкестендіргіш ашкөз режим механизміне ұқсас жұмыс істейді. Айырмашылығы мынада, мәтінді жолдың соңына дейін түсіргенде, артқа қарай іздеу болмайды. Яғни, аса ашкөздік режиміндегі алғашқы үш кезең сараңдық режиміне ұқсас болады. Бүкіл жолды түсіргеннен кейін, сәйкестендіргіш үлгінің қалған бөлігін қосады және оны түсірілген жолмен салыстырады. Біздің мысалда « » үлгісімен негізгі әдісті орындау кезіндеА.++а
сәйкестік табылмайды.
Жалқау квантор режимі
-
Бұл режимде, ашкөз режимдегі сияқты, бастапқы кезеңде үлгінің бірінші таңбасымен сәйкестік ізделеді:
-
Содан кейін ол үлгідегі келесі таңбамен сәйкестікті іздейді - кез келген таңба:
-
Ашкөздік режимінен айырмашылығы, жалқау режим мәтіндегі ең қысқа сәйкестікті іздейді, сондықтан нүкте арқылы көрсетілген және мәтіннің No 6 позициясындағы таңбаға сәйкес келетін үлгінің екінші таңбасымен сәйкестікті тапқаннан кейін ол
Matcher
мәтіннің үлгінің қалған бөлігіне – “а
” таңбасына сәйкес келетінін тексереді. -
Мәтіндегі өрнекпен сәйкестік табылмағандықтан (мәтіндегі № 7 позицияда «
л
» белгісі бар),Matcher
ол бір немесе бірнеше рет көрсетілгендіктен үлгіге басқа «кез келген таңбаны» қосады, және үлгіні №5-тен 8-ге дейінгі позициялардағы мәтінмен қайтадан салыстырады: -
Біздің жағдайда сәйкестік табылды, бірақ мәтіннің соңына әлі жеткен жоқ. Сондықтан, No9 позициядан тексеру ұқсас алгоритмді пайдаланып үлгінің бірінші таңбасын іздеуден басталады, содан кейін мәтіннің соңына дейін қайталанады.
main
« » үлгісін пайдаланған кезде А.+?а
біз келесі нәтижеге қол жеткіземіз: Alla Alexa Біздің мысалдан көріп отырғанымыздай, бір үлгі үшін әртүрлі квантор режимдерін пайдаланған кезде әртүрлі нәтижелер алдық. Сондықтан, бұл мүмкіндікті ескеріп, іздеу кезінде қажетті нәтижеге байланысты қажетті режимді таңдау керек.
Тұрақты тіркестердегі таңбалардан қашу
Java тіліндегі тұрақты өрнек, дәлірек айтқанда оның бастапқы көрінісі жол литералы арқылы көрсетілгендіктен, жол литералдарына қатысты Java спецификациясының ережелерін ескеру қажет. Атап айтқанда,\
Java бастапқы codeындағы жол литералдарындағы кері қиғаш сызық таңбасы компиляторға өзінен кейінгі таңбаның арнайы таңба екенін және арнайы жолмен түсіндірілуі керектігін ескертетін қашу таңбасы ретінде түсіндіріледі. Мысалы:
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
Сондықтан, тұрақты өрнекті сипаттайтын және " " таңбасын пайдаланатын жол литералдарында \
(мысалы, метатаңбалар үшін) Java byte codeының компиляторы оны басқаша түсіндірмеуі үшін оны екі есе көбейту керек . Мысалы:
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()
– нысан жасалған тұрақты өрнектің бастапқы жол көрінісін қайтарады 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
орындалады; - at
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);
}
}
Консоль шығысы: Егор Алла Анна -------- Егор Алла АннаMatcher
Төменде нысанды құрудың басқа класс әдісін қарастырамыз.
Сәйкестендіру класының әдістері
Matcher
үлгілерді іздеу үшін нысан жасалатын класс. Matcher
– бұл «іздеу жүйесі», тұрақты тіркестердің «қозғалтқышы». Іздеу үшін оған екі нәрсені беру керек: іздеу үлгісі және іздеуге болатын «мекен-жай». Нысан жасау үшін Matcher
сыныпта келесі әдіс қарастырылған Pattern
: рublic Matcher matcher(CharSequence input)
Аргумент ретінде әдіс іздеу орындалатын таңбалар тізбегін алады. Бұл интерфейсті жүзеге асыратын сыныптардың an objectілері CharSequence
. String
Сіз ғана емес , сонымен қатар , және StringBuffer
дәлел StringBuilder
ретінде өтуге болады . Іздеу үлгісі әдіс шақырылатын сынып нысаны болып табылады . Сәйкестендіру құралын құру мысалы: Segment
CharBuffer
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-ке дейін Егор Ира Анна Егор Ольга Ольга Егор Алла Анна Мысалдан әдістер жаңа нысанды - жолды replaceFirst
жасайтыны анық . үлгімен сәйкестіктер дәлел ретінде әдіске жіберілген мәтінмен ауыстырылатын бастапқы мәтін болып табылады. Сонымен қатар, әдіс тек бірінші сәйкестікті және сынақтағы барлық сәйкестіктерді ауыстырады. Түпнұсқа мәтін өзгеріссіз қалады. Басқа сынып әдістерін қолдану , сондай-ақ тұрақты тіркестердің мысалдарын осы мақалалар сериясынан табуға болады . Мәтінмен жұмыс істеу кезінде тұрақты өрнектермен жиі қолданылатын амалдар сыныптардан алынған және . Бұл , , , сияқты әдістер . Бірақ, шын мәнінде, «капот астында» олар және пайдаланады . Сондықтан, қажетсіз code жазбай, мәтінді ауыстыру немесе бағдарламадағы жолдарды салыстыру қажет болса, әдістерін пайдаланыңыз . Егер сізге қосымша мүмкіндіктер қажет болса, сыныптар туралы және . replaceAll
String
replaceFirst
replaceAll
Matcher
Pattern
Matcher
String
split
matches
replaceFirst
replaceAll
Pattern
Matcher
String
Pattern
Matcher
Қорытынды
Тұрақты өрнек Java бағдарламасында ережелермен анықталған үлгіге сәйкес келетін жолдар арқылы сипатталады. Код іске қосылғанда, Java бұл жолды сынып нысанына қайта құрастырады және мәтіндегі сәйкестіктерді табу үшінPattern
сынып нысанын пайдаланады . Matcher
Бастапқыда айтқанымдай, тұрақты тіркестер қиын тақырып ретінде кейінге қалдырылады. Дегенмен, синтаксистің, метатаңбалардың, қашудың негіздерін түсініп, тұрақты тіркестердің мысалдарын зерттесеңіз, олар бір қарағанда қарапайым болып шығады.
GO TO FULL VERSION