JavaRush /Java блогы /Random-KK /Java тіліндегі тұрақты өрнектер (RegEx)

Java тіліндегі тұрақты өрнектер (RegEx)

Топта жарияланған
Тұрақты өрнектер - бұл бағдарламашылар, тіпті тәжірибелі адамдар, көбінесе кейінге қалдыратын тақырып. Дегенмен, Java әзірлеушілерінің көпшілігі ерте ме, кеш пе мәтінді өңдеумен айналысуға мәжбүр болады. Көбінесе - мәтіндегі іздеу әрекеттерімен және өңдеумен. Тұрақты өрнектерсіз мәтінді өңдеумен байланысты өнімді және ықшам бағдарлама codeын елестету мүмкін емес. Сондықтан оны кейінге қалдыруды доғарыңыз, дәл қазір «тұрақтылармен» айналысайық. Бұл соншалықты қиын жұмыс емес.

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 жасау үшін екі қарапайым қадамды орындау керек:
  1. оны тұрақты өрнек синтаксисін пайдаланып жол ретінде жазу;
  2. бұл жолды тұрақты өрнекке құрастыру;
Кез келген Java бағдарламасында тұрақты өрнектермен жұмыс сынып an objectісін жасаудан басталады 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.

Тұрақты өрнек синтаксисі

<([{\^-=$!|]})?*+.>Тұрақты өрнек синтаксисі алфавиттік таңбалармен біріктірілуі мүмкін белгілерді пайдалануға негізделген . Олардың рөліне қарай оларды бірнеше топқа бөлуге болады:
1. Сәйкес сызық шекараларына немесе мәтінге арналған метатаңбалар
Метатаңба Мақсат
^ жолдың басы
$ жолдың соңы
\b сөз шекарасы
\B сөздің шегі емес
енгізудің басталуы
алдыңғы матчтың соңы
енгізудің соңы
\z енгізудің соңы
2. Кейіпкерлер кластарын іздеуге арналған метатаңбалар
Метатаңба Мақсат
\d сандық таңба
\D сандық емес таңба
\s кеңістік сипаты
бос орынсыз таңба
\w әріптік-сандық таңба немесе астын сызу
алфавиттік, сандық немесе астын сызудан басқа кез келген таңба
. кез келген кейіпкер
3. Мәтінді өңдеу символдарын іздеуге арналған метатаңбалар
Метатаңба Мақсат
\t қойынды таңбасы
\n жаңа жол таңбасы
\r каретканы қайтару сипаты
\f жаңа бетке өтіңіз
\u0085 келесі жол символы
\u 2028 жолды бөлгіш таңба
\u 2029 абзацты бөлу белгісі
4. Кейіпкерлерді топтастыруға арналған метатаңбалар
Метатаңба Мақсат
[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 таңбалары)
5. Таңбалар санын көрсететін метасимволдар – кванторлар. Квантор әрқашан таңбадан немесе таңбалар тобынан кейін келеді.
Метатаңба Мақсат
? біреуі немесе жоқ
* нөл немесе одан да көп рет
+ бір немесе бірнеше рет
{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 Берілген үлгіні іздеу алгоритмі " А.+а" келесі ретпен орындалады:
  1. Берілген үлгіде бірінші таңба - орыс әріпінің таңбасы А. Matcherоны нөл позициясынан бастап мәтіннің әрбір таңбасымен сәйкестендіреді. Біздің мәтіндегі нөлдік позицияда таңба бар Е, сондықтан Matcherол үлгіге сәйкес келгенше мәтіндегі таңбаларды ретімен өтеді. Біздің мысалда бұл №5 позициядағы таңба.

    Java тіліндегі тұрақты өрнектер - 2
  2. Үлгінің бірінші таңбасымен сәйкестік табылғаннан кейін Matcherол өрнектің екінші таңбасымен сәйкестігін тексереді. Біздің жағдайда бұл .кез келген таңбаны білдіретін « » таңбасы.

    Java тіліндегі тұрақты өрнектер - 3

    Алтыншы позицияда әріп белгісі л. Әрине, ол «кез келген кейіпкер» үлгісіне сәйкес келеді.

  3. Matcherүлгідегі келесі таңбаны тексеруге көшеді. Біздің шаблонымызда ол « .+» кванторы арқылы көрсетілген. Үлгідегі «кез келген таңбаның» қайталану саны бір немесе бірнеше рет болғандықтан, Matcher«кез келген таңба» шарты орындалса, жолдан кезекпен келесі таңбаны алып, үлгіге сәйкестігін тексереді. біздің мысалда - жолдың соңына дейін (мәтіннің No 7 - No 18 позициясынан).

    Java тіліндегі тұрақты өрнектер - 4

    Шындығында, Matcherол бүкіл сызықты соңына дейін түсіреді - дәл осы жерде оның «ашкөздігі» көрінеді.

  4. MatcherМәтіннің соңына жеткеннен кейін және А.+үлгінің “ ” бөлігін тексеруді аяқтағаннан кейін, Матчер үлгінің қалған бөлігін – әріп таңбасын тексеруді бастайды а. Алға бағыттағы мәтін аяқталғандықтан, тексеру соңғы таңбадан бастап кері бағытта жүреді:

    Java тіліндегі тұрақты өрнектер - 5
  5. Matcher.+Мәтіннің соңына жеткен " " үлгісіндегі қайталаулар санын "есте сақтайды ", сондықтан қайталау санын бір-бірге азайтады және сәйкестік табылғанша мәтін үлгісін тексереді:Java тіліндегі тұрақты өрнектер - 6

Өте ашкөз кванфикатор режимі

Өте ашкөз режимде сәйкестендіргіш ашкөз режим механизміне ұқсас жұмыс істейді. Айырмашылығы мынада, мәтінді жолдың соңына дейін түсіргенде, артқа қарай іздеу болмайды. Яғни, аса ашкөздік режиміндегі алғашқы үш кезең сараңдық режиміне ұқсас болады. Бүкіл жолды түсіргеннен кейін, сәйкестендіргіш үлгінің қалған бөлігін қосады және оны түсірілген жолмен салыстырады. Біздің мысалда « » үлгісімен негізгі әдісті орындау кезінде А.++асәйкестік табылмайды. Java тіліндегі тұрақты өрнектер - 7

Жалқау квантор режимі

  1. Бұл режимде, ашкөз режимдегі сияқты, бастапқы кезеңде үлгінің бірінші таңбасымен сәйкестік ізделеді:

    Java тіліндегі тұрақты өрнектер - 8
  2. Содан кейін ол үлгідегі келесі таңбамен сәйкестікті іздейді - кез келген таңба:

    Java тіліндегі тұрақты өрнектер - 9
  3. Ашкөздік режимінен айырмашылығы, жалқау режим мәтіндегі ең қысқа сәйкестікті іздейді, сондықтан нүкте арқылы көрсетілген және мәтіннің No 6 позициясындағы таңбаға сәйкес келетін үлгінің екінші таңбасымен сәйкестікті тапқаннан кейін ол Matcherмәтіннің үлгінің қалған бөлігіне – “ а” таңбасына сәйкес келетінін тексереді.

    Java тіліндегі тұрақты өрнектер - 10
  4. Мәтіндегі өрнекпен сәйкестік табылмағандықтан (мәтіндегі № 7 позицияда « л» белгісі бар), Matcherол бір немесе бірнеше рет көрсетілгендіктен үлгіге басқа «кез келген таңбаны» қосады, және үлгіні №5-тен 8-ге дейінгі позициялардағы мәтінмен қайтадан салыстырады:

    Java тіліндегі тұрақты өрнектер - 11
  5. Біздің жағдайда сәйкестік табылды, бірақ мәтіннің соңына әлі жеткен жоқ. Сондықтан, No9 позициядан тексеру ұқсас алгоритмді пайдаланып үлгінің бірінші таңбасын іздеуден басталады, содан кейін мәтіннің соңына дейін қайталанады.

    Java тіліндегі тұрақты өрнектер - 12
Әдіс нәтижесінде 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ретінде өтуге болады . Іздеу үлгісі әдіс шақырылатын сынып нысаны болып табылады . Сәйкестендіру құралын құру мысалы: SegmentCharBufferPatternmatcher
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 жазбай, мәтінді ауыстыру немесе бағдарламадағы жолдарды салыстыру қажет болса, әдістерін пайдаланыңыз . Егер сізге қосымша мүмкіндіктер қажет болса, сыныптар туралы және . replaceAllStringreplaceFirstreplaceAllMatcherPatternMatcherStringsplitmatchesreplaceFirstreplaceAllPatternMatcherStringPatternMatcher

Қорытынды

Тұрақты өрнек Java бағдарламасында ережелермен анықталған үлгіге сәйкес келетін жолдар арқылы сипатталады. Код іске қосылғанда, Java бұл жолды сынып нысанына қайта құрастырады және мәтіндегі сәйкестіктерді табу үшін Patternсынып нысанын пайдаланады . MatcherБастапқыда айтқанымдай, тұрақты тіркестер қиын тақырып ретінде кейінге қалдырылады. Дегенмен, синтаксистің, метатаңбалардың, қашудың негіздерін түсініп, тұрақты тіркестердің мысалдарын зерттесеңіз, олар бір қарағанда қарапайым болып шығады.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION