JavaRush /Java блогы /Random-KK /Java тіліндегі тұрақты өрнектер, 1 бөлім

Java тіліндегі тұрақты өрнектер, 1 бөлім

Топта жарияланған
Назарларыңызға JavaWorld веб-сайты үшін Джефф Фризен жазған Java тіліндегі тұрақты өрнектерге арналған қысқаша нұсқаулықтың аудармасын ұсынамыз . Оқуға ыңғайлы болу үшін мақаланы бірнеше бөлікке бөлдік. Java тіліндегі тұрақты өрнектер, 1 - 1 бөлім

Үлгілерді тану және сипаттау үшін Java бағдарламаларында Regular Expression API пайдалану

Java таңбасы және әртүрлі жол деректер түрлері үлгіні сәйкестендіру үшін төмен деңгейдегі қолдауды қамтамасыз етеді, бірақ оларды осы мақсатта пайдалану әдетте codeтың айтарлықтай күрделілігін қосады. Қарапайым және тиімдірек code Regex API («Regular Expression API») арқылы алынады. Бұл оқулық тұрақты өрнектермен және Regex API интерфейсімен жұмысты бастауға көмектеседі. Біз алдымен пакеттегі ең қызықты үш сыныпты талқылаймыз java.util.regex, содан кейін сыныптың ішіне қарап Pattern, оның күрделі үлгіге сәйкес конструкцияларын зерттейміз. Назар аударыңыз: Демо-қосымшаның бастапқы codeын (JavaWorld сайты үшін Джефф Фризен жасаған) осы мақаладан осы жерден жүктеп алуға болады .

Тұрақты тіркестер дегеніміз не?

Тұрақты өрнек (тұрақты өрнек/regex/regexp) белгілі бір жолдар жинағын сипаттайтын үлгі болып табылатын жол болып табылады. Үлгі қандай жолдар жиынға жататынын анықтайды. Үлгі литералдар мен метатаңбалардан — тура мағынадан гөрі ерекше мағынаға ие таңбалардан тұрады. Үлгіні сәйкестендіру – сәйкестіктерді, яғни тұрақты өрнек үлгісіне сәйкес келетін жолдарды табу үшін мәтінді іздеу. Java өзінің Regex API арқылы үлгі сәйкестігін қолдайды. Бұл API үш сыныптан тұрады: Pattern, Matcherжәне PatternSyntaxException, бумада орналасқан java.util.regex:
  • Үлгілер деп те аталатын сынып нысандары Patternтұрақты өрнектер болып табылады.
  • сынып an objectілері Matcherнемесе сәйкестіктер таңбалар тізбегіндегі сәйкестіктерді табуға арналған үлгіні түсіндіру механизмдері болып табылады (сыныптары интерфейсті жүзеге асыратын java.lang.CharSequenceжәне мәтін көзі ретінде қызмет ететін нысандар).
  • Сынып нысандары PatternSyntaxExceptionжарамсыз тұрақты өрнек үлгілерін сипаттау үшін пайдаланылады.
Java сонымен қатар әртүрлі әдістер арқылы үлгіні сәйкестендіруге қолдау көрсетеді java.lang.String. Мысалы, функция шақырушы жол тұрақты өрнекке дәл сәйкес келсе ғана boolean matches (String regex)қайтарады . trueregex
Ыңғайлы әдістер
matches()және класстың басқа тұрақты өрнекке бағытталған ыңғайлылық әдістері StringRegex API-ге ұқсас түрде капот астында жүзеге асырылады.

RegexDemo

Мен Java тұрақты өрнектерін және , және RegexDemoәртүрлі әдістерін көрсету үшін қолданба жасадым . Төменде осы демонстрациялық қолданбаның бастапқы codeы берілген. Листинг 1. Тұрақты өрнекті көрсету PatternMatcherPatternSyntaxException
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java RegexDemo regex input");
         return;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      args[1] = args[1].replaceAll("\\\\n", "\n");
      try
      {
         System.out.println("regex = " + args[0]);
         System.out.println("input = " + args[1]);
         Pattern p = Pattern.compile(args[0]);
         Matcher m = p.matcher(args[1]);
         while (m.find())
            System.out.println("Found [" + m.group() + "] starting at "
                               + m.start() + " and ending at " + (m.end() - 1));
      }
      catch (PatternSyntaxException pse)
      {
         System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
         System.err.println("Описание: " + pse.getDescription());
         System.err.println("Позиция: " + pse.getIndex());
         System.err.println("Неправильный шаблон: " + pse.getPattern());
      }
   }
}
mainКласс әдісі жасайтын бірінші нәрсе RegexDemo- оның пәрмен жолын тексеру. Ол екі аргументті қажет етеді: біріншісі - тұрақты өрнек, екіншісі - тұрақты өрнек ізделетін кіріс мәтіні. Енгізілген мәтін ішінде жаңа жол таңбасын пайдалану қажет болуы мүмкін (\n). \Мұны тек таңбадан кейін таңбаны көрсету арқылы жасауға болады n. Функция main()осы таңбалар тізбегін Юниcode мәніне 10 түрлендіреді. Java тіліндегі тұрақты өрнектер, 1 - 2 бөлімКодтың негізгі RegexDemoбөлігі try-catch. Блок tryалдымен берілген тұрақты өрнекті және енгізу мәтінін шығарады, содан кейін құрастырылған тұрақты өрнекті сақтайтын нысанды жасайды Pattern(үлгіні сәйкестендіру өнімділігін жақсарту үшін тұрақты өрнектер құрастырылады). Сәйкестік нысаннан шығарылады Patternжәне барлығы табылғанша сәйкестіктерді итеративті түрде іздеу үшін пайдаланылады. Блок ерекше жағдай туралы пайдалы ақпаратты алу үшін catchбірнеше сынып әдістерін шақырады . PatternSyntaxExceptionБұл ақпарат шығыс ағынына дәйекті түрде шығарылады. Кодтың қалай жұмыс істейтіні туралы егжей-тегжейлерді білудің қажеті жоқ: олар API-ны мақаланың екінші бөлігінде зерттеген кезде анық болады. Дегенмен, 1-тізімді құрастыру керек. 1-тізімнен codeты алып, компиляциялау үшін пәрмен жолына келесі пәрменді теріңіз RegexDemo: javac RegexDemo.java

Pattern класы және оның конструкциялары

PatternRegex API құрайтын үш сыныптың біріншісі класс тұрақты өрнектің құрастырылған көрінісі болып табылады. Сынып SDK құжаттамасы Patternәртүрлі тұрақты өрнек конструкцияларын сипаттайды, бірақ тұрақты өрнектерді белсенді түрде пайдаланбасаңыз, бұл құжаттаманың бөліктері шатасуы мүмкін. Кванторлар дегеніміз не және сараң, құлықсыз және иелік сандық анықтауыштардың айырмашылығы неде? Таңба кластары, шекара сәйкестіктері, кері сілтемелер және енгізілген жалауша өрнектері дегеніміз не? Осы және басқа сұрақтарға келесі бөлімдерде жауап беремін.

Әріптік жолдар

Ең қарапайым тұрақты өрнек конструкциясы әріптік жол болып табылады. Үлгіні сәйкестендіру сәтті болуы үшін кіріс мәтінінің кейбір бөлігі сол құрылымның үлгісіне сәйкес келуі керек. Келесі мысалды қарастырыңыз: Бұл мысалда біз енгізу мәтініндегі java RegexDemo apple applet үлгіге сәйкестік табуға тырысамыз . Келесі нәтиже табылған сәйкестікті көрсетеді: appleapplet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Біз шығыста тұрақты өрнек пен кіріс мәтінін көреміз, содан кейін appleапплеттегі сәтті анықтау көрсеткішін көреміз. Сонымен қатар, осы матчтың бастапқы және соңғы позициялары берілген: 0және 4сәйкесінше. Бастапқы позиция мәтіндегі сәйкестік табылған бірінші орынды, ал соңғы позиция сәйкестіктің соңғы нүктесін көрсетеді. Енді біз келесі пәрмен жолын бердік делік: java RegexDemo apple crabapple Бұл жолы әртүрлі бастапқы және аяқталу орындарымен келесі нәтижені аламыз:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Әйтпесе, кіріс мәтіні appletтұрақты өрнекпен және ретінде apple, сәйкестік табылмайды. Бүкіл тұрақты өрнек сәйкес келуі керек, бірақ бұл жағдайда кіріс мәтінінде -ден tкейін болмайды apple. Java тіліндегі тұрақты өрнектер, 1 - 3 бөлім

Метатаңбалар

Неғұрлым қызықты тұрақты өрнек конструкциялары әріптік таңбаларды метатаңбалармен біріктіреді. Мысалы, тұрақты өрнекте a.bнүкте метатаңбасы және b (.)арасындағы кез келген таңбаны білдіреді a. Келесі мысалды қарастырыңыз: java RegexDemo .ox "The quick brown fox jumps over the lazy ox." Бұл мысал .oxқалыпты өрнек ретінде де, The quick brown fox jumps over the lazy ox.кіріс мәтіні ретінде де пайдаланады. RegexDemoмәтіннен кез келген таңбадан басталатын және аяқталатын сәйкестіктерді іздейді ox.Оның орындалу нәтижелері келесідей:
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
Шығаруда біз екі сәйкестікті көреміз: foxжәне ox(оның алдында бос орын белгісі бар). Метатаңба бірінші жағдайда . таңбаға f, екіншісінде бос орынға сәйкес келеді. .oxЕгер сіз оны метатаңбамен ауыстырсаңыз не болады .? Яғни, келесі пәрмен жолының нәтижесінде не аламыз: java RegexDemo . "The quick brown fox jumps over the lazy ox." Нүкте метатаңбасы кез келген таңбаға сәйкес болғандықтан, RegexDemoкіріс мәтінінің барлық таңбалары (соның ішінде соңғы нүкте таңбасы) үшін табылған сәйкестіктерді шығарады:
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
Цитата метатаңбалары
Тұрақты өрнек құрылымында әріптік таңба ретінде немесе кез келген басқа метатаңбаны көрсету үшін .келесі жолдардың бірімен одан құтылу керек:
  • оның алдына кері қиғаш сызық белгісін қойыңыз;
  • Бұл метатаңбаны \Qжәне арасына қойыңыз \E(мысалы, \Q.\E).
Кері қиғаш сызықтар сияқты жолдың литералында пайда болатын кез келген таңбаларды көшіруді ұмытпаңыз String regex = "\\.";(мысалы, \\.немесе \\Q.\\E). Пәрмен жолы аргументінің бөлігі болып табылатын кері қиғаш сызықтарды көшірмеңіз.

Кейіпкерлер кластары

Кейде сіз іздеген сәйкестіктерді белгілі бір таңбалар жиынтығымен шектеуіңіз керек. Мысалы, мәтіннен a, e, және i, дауысты дыбыстарды іздеңіз , дауысты әріптің әрбір кездесуі сәйкестік деп саналады. Мұндай есептерді шешуде бізге тік жақшаның ( ) метатаңбалары арасындағы таңбалар жиынын анықтайтын таңбалар кластары көмектеседі . Класс қарапайым таңба сыныптарын, ауқым сыныптарын, кері, біріктіру, қиылысу және алу класстарын қолдайды. Біз қазір олардың барлығын қарастырамыз. ou[ ]Pattern

Қарапайым кейіпкерлер кластары

Қарапайым таңбалар класы қатар орналасқан таңбалардан тұрады және тек сол таңбаларға сәйкес келеді. Мысалы, сынып , және [abc]таңбаларына сәйкес келеді . Келесі мысалды қарастырыңыз: Нәтижелерден көріп отырғаныңыздай, бұл мысалда тек сәйкестік бар таңба : abcjava RegexDemo [csw] caveccave
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

Төңкерілген кейіпкерлер кластары

Төңкерілген таңбалар класы метатаңбадан басталады ^және онда қамтылмаған таңбаларға ғана сәйкес келеді. Мысалы, сынып , және қоспағанда [^abc]барлық таңбаларға сәйкес келеді . Келесі мысалды қарастырыңыз: Менің операциялық жүйемде (Windows) қос тырнақшалар қажет екенін ескеріңіз, себебі қабық оларды шығу таңбасы ретінде қарастырады. Көріп отырғаныңыздай, бұл мысалда тек және таңбалары табылды , олар үшін сәйкестіктер бар : abcjava RegexDemo "[^csw]" cave^avecave
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3

Ауқымды таңбалар кластары

Ауқым таңбалар класы сызықша ( -) арқылы бөлінген екі таңбадан тұрады. Дефистің сол жағындағы таңбадан басталып, оң жағындағы таңбамен аяқталатын барлық таңбалар ауқымның бөлігі болып табылады. Мысалы, ауқым [a-z]барлық кіші латын әріптеріне сәйкес келеді. Бұл қарапайым классты анықтауға тең [abcdefghijklmnopqrstuvwxyz]. Келесі мысалды қарастырыңыз: Бұл мысал тек ішінде сәйкес келетін java RegexDemo [a-c] clown таңбаға сәйкес келеді : cclown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java тіліндегі тұрақты өрнектер, 2 бөлім Java тіліндегі тұрақты өрнектер, 3 бөлім Java тіліндегі тұрақты өрнектер, 4 бөлім Java тіліндегі тұрақты өрнектер, 5 бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION