Биз сиздердин назарыңыздарга JavaWorld веб-сайты үчүн Джефф Фризен тарабынан жазылган Java тorндеги туруктуу сөз айкаштары боюнча кыска жолдун котормосун сунуштайбыз . Окууга ыңгайлуу болушу үчүн биз макаланы бир нече бөлүккө бөлдүк.
Үлгүлөрдү таануу жана сүрөттөө үчүн 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)
кайтарат .
true
regex
Ыңгайлуу ыкмалар |
matches() жана класстын башка регулярдуу экспрессияга багытталган ыңгайлуулук ыкмалары String Regex APIге окшош түрдө капоттун астында ишке ашырылат. |
RegexDemo
Мен Java регулярдуу туюнтмаларын жана , жана
RegexDemo
ар кандай ыкмаларын көрсөтүү үчүн колдонмо түздүм . Төмөндө бул демо колдонмонун баштапкы codeу болуп саналат. Листинг 1. Регулярдуу туюнтма көрсөтүү
Pattern
Matcher
PatternSyntaxException
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;
}
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 которот.
Коддун негизги
RegexDemo
бөлүгү
try-catch
. Блок адегенде берилген регулярдуу туюнтманы жана киргизүү текстин чыгарат, андан кийин компиляцияланган регулярдуу туюнтманы сактаган
try
an objectти түзөт (кадимки туюнтмалар үлгүнүн дал келүүсүн жакшыртуу үчүн түзүлөт).
Pattern
Объекттен дал келүүчү чыгарылып
Pattern
, баары табылганга чейин дал келүүлөрдү кайталап издөө үчүн колдонулат. блок өзгөчө жөнүндө пайдалуу маалыматты алуу үчүн
catch
бир нече класс ыкмаларын чакырат .
PatternSyntaxException
Бул маалымат ырааттуу түрдө чыгаруу агымына чыгарылат. Азырынча codeдун кантип иштээри тууралуу майда-чүйдөсүнө чейин билүүнүн кереги жок: алар макаланын экинчи бөлүгүндө APIди изилдегенибизде айкын болот. Бирок, сиз 1-листингди компиляциялашыңыз керек. 1-листингден codeду алып, компиляциялоо үчүн буйрук сабына төмөнкү буйрукту териңиз
RegexDemo
:
javac RegexDemo.java
Pattern классы жана анын конструкциялары
Pattern
Regex APIди түзгөн үч класстын биринчиси класс - бул кадимки туюнтумдун компиляцияланган өкүлчүлүгү. SDK классынын documentтери
Pattern
ар кандай регулярдуу туюнтма түзүмдөрүн сүрөттөйт, бирок сиз кадимки туюнтмаларды жигердүү колдонбосоңуз, бул documentациянын бөлүктөрү чаташып калышы мүмкүн. Кванторлор деген эмне жана ач көз, каалабаган жана ээлик кылуучу кванторлордун ортосунда кандай айырма бар? Белги класстары, чек ара дал келүүчүлөрү, артка шилтемелер жана кыстарылган желек туюнтмалар деген эмне? Ушул жана башка суроолорго кийинки бөлүмдөрдө жооп берем.
Литералдык саптар
Эң жөнөкөй регулярдуу туюнтма түзүлүшү түз сап болуп саналат. Үлгү дал келүү ийгorктүү болушу үчүн, киргизилген тексттин айрым бөлүгү ошол конструкциянын үлгүсүнө дал келиши керек. Төмөнкү мисалды карап көрөлү: Бул мисалда биз киргизүү текстиндеги
java RegexDemo apple applet
үлгүгө дал келүүнү табууга аракет кылып жатабыз . Төмөнкү натыйжа табылган дал келүүнү көрсөтөт:
apple
applet
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
.
Метабелгилер
Кызыктуу регулярдуу туюнтма түзүмдөрү түз тамгаларды мета символдор менен айкалыштырат. Мисалы, регулярдуу туюнтмасында
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
, үндүү тыбыштарды издеңиз, ар бир үндүү тамга дал келүүчү деп эсептелет. Мындай маселелерди чечүүдө бизге төрт бурчтуу кашаанын ( ) метасимволдорунун ортосундагы символдордун топтомун аныктаган символ класстары жардам берет . Класс жөнөкөй символ класстарын, диапазон класстарын, тескери, биримдик, кесorш жана кемитүү класстарын колдойт. Биз азыр алардын баарын карап чыгабыз.
o
u
[ ]
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) кош тырмакчалар талап кылынат, анткени кабык аларды качуу символу катары карайт. Көрүнүп тургандай, бул мисалда , жана белгилери гана табылган , алар үчүн дал келүүлөр бар :
a
b
c
java RegexDemo "[^csw]" cave
^
a
v
e
cave
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
белгиге гана дал келет :
c
clown
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-бөлүк
GO TO FULL VERSION