JavaRush /Java блогу /Random-KY /Java тилиндеги кадимки туюнтмалар, 1-бөлүк

Java тилиндеги кадимки туюнтмалар, 1-бөлүк

Группада жарыяланган
Биз сиздердин назарыңыздарга JavaWorld веб-сайты үчүн Джефф Фризен тарабынан жазылган Java тorндеги туруктуу сөз айкаштары боюнча кыска жолдун котормосун сунуштайбыз . Окууга ыңгайлуу болушу үчүн биз макаланы бир нече бөлүккө бөлдүк. Java тorндеги кадимки туюнтмалар, 1-1-бөлүк

Үлгүлөрдү таануу жана сүрөттөө үчүн Java программаларында Регулярдуу 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:
  • класс an objectтери Pattern, ошондой эле калыптар деп аталат, туруктуу сөз айкаштары түзүлгөн.
  • класс an objectтери Matcherже дал келүүчүлөр, символдордун ырааттуулугунан дал келүүлөрдү табуу үчүн үлгү интерпретациялоо механизмдери (класстары интерфейсти ишке ашырган java.lang.CharSequenceжана текст булагы катары кызмат кылган an objectтер).
  • Класс an objectтери 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 тorндеги кадимки туюнтмалар, 1-2-бөлүкКоддун негизги RegexDemoбөлүгү try-catch. Блок адегенде берилген регулярдуу туюнтманы жана киргизүү текстин чыгарат, андан кийин компиляцияланган регулярдуу туюнтманы сактаган tryan objectти түзөт (кадимки туюнтмалар үлгүнүн дал келүүсүн жакшыртуу үчүн түзүлөт). PatternОбъекттен дал келүүчү чыгарылып Pattern, баары табылганга чейин дал келүүлөрдү кайталап издөө үчүн колдонулат. блок өзгөчө жөнүндө пайдалуу маалыматты алуу үчүн catchбир нече класс ыкмаларын чакырат . PatternSyntaxExceptionБул маалымат ырааттуу түрдө чыгаруу агымына чыгарылат. Азырынча codeдун кантип иштээри тууралуу майда-чүйдөсүнө чейин билүүнүн кереги жок: алар макаланын экинчи бөлүгүндө APIди изилдегенибизде айкын болот. Бирок, сиз 1-листингди компиляциялашыңыз керек. 1-листингден codeду алып, компиляциялоо үчүн буйрук сабына төмөнкү буйрукту териңиз RegexDemo: javac RegexDemo.java

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

PatternRegex APIди түзгөн үч класстын биринчиси класс - бул кадимки туюнтумдун компиляцияланган өкүлчүлүгү. SDK классынын documentтери Patternар кандай регулярдуу туюнтма түзүмдөрүн сүрөттөйт, бирок сиз кадимки туюнтмаларды жигердүү колдонбосоңуз, бул documentациянын бөлүктөрү чаташып калышы мүмкүн. Кванторлор деген эмне жана ач көз, каалабаган жана ээлик кылуучу кванторлордун ортосунда кандай айырма бар? Белги класстары, чек ара дал келүүчүлөрү, артка шилтемелер жана кыстарылган желек туюнтмалар деген эмне? Ушул жана башка суроолорго кийинки бөлүмдөрдө жооп берем.

Литералдык саптар

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

Метабелгилер

Кызыктуу регулярдуу туюнтма түзүмдөрү түз тамгаларды мета символдор менен айкалыштырат. Мисалы, регулярдуу туюнтмасында a.bчекит метабелгиси жана b (.)ортосундагы каалаган символду билдирет . aТөмөнкү мисалды карап көрөлү: Бул мисал кадимки туюнтма катары да, киргизүү тексти катары да java RegexDemo .ox "The quick brown fox jumps over the lazy ox." колдонот . текстти каалаган белгиден башталып, менен аяктаган дал келүүлөрдү издейт Анын аткарылышынын натыйжалары төмөнкүдөй: .oxThe quick brown fox jumps over the lazy ox.RegexDemoox.
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, үндүү тыбыштарды издеңиз, ар бир үндүү тамга дал келүүчү деп эсептелет. Мындай маселелерди чечүүдө бизге төрт бурчтуу кашаанын ( ) метасимволдорунун ортосундагы символдордун топтомун аныктаган символ класстары жардам берет . Класс жөнөкөй символ класстарын, диапазон класстарын, тескери, биримдик, кесorш жана кемитүү класстарын колдойт. Биз азыр алардын баарын карап чыгабыз. ou[ ]Pattern

Жөнөкөй каармандардын класстары

Жөнөкөй символдор классы жанаша жайгаштырылган символдордон турат жана ошол символдорго гана дал келет. Мисалы, класс белгилерге [abc]дал келет aжана b. cТөмөнкү мисалды карап көрөлү: java RegexDemo [csw] cave Жыйынтыктардан көрүнүп тургандай, бул мисалда cдал келген белги гана cave:
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 тorндеги кадимки туюнтмалар, 2-бөлүк Java тorндеги кадимки туюнтмалар, 3-бөлүк Java тorндеги кадимки туюнтмалар, 4-бөлүк Java тorндеги кадимки туюнтмалар, 5-бөлүк
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION