Сложенији регуларни изрази¶
Поклапање једним од неколико израза¶
У прошлој лекцији смо видели да знак |
(који у овом контексту читамо: или) у регуларним изразима
служи да раздвоји алтернативе. На пример, израз ученик|ученица
поклапа речи ученик
и ученица
.
Знак |
се често користи и у комбинацији са облим заградама (
и )
, које служе за груписање
делова израза. На пример, израз учени(к|(ца))
такође поклапа текстове ученик
и ученица
,
тако што поклапа слова учени
, за којима следи или слово к
или слова ца
.
У следећој табели дато је неколико сличних примера.
Израз |
Примери поклапања |
---|---|
учени(к|(ца)) |
|
бинарно\s+(дрво)|(стабло) |
|
Крушев((ац)|(ца)|(цу)) |
|
Крушев(ац)|(ца)|(цу) |
|
A((21)|(32))-B((63)|(15)) |
|
На тај начин многи регуларни изрази могу да се запишу краће.
Вежбање
Задајте регуларан израз који поклапа било коју од речи двојица
, двојице
,
двојици
, двојицу
, двојицом
.
У овом вежбању претрага није осетљива на мала и велика слова.
Задајте регуларан израз који поклапа било који од текстова
бели краљ
, бели топ
, бели ловац
, бели скакач
, бели пешак
,црни краљ
, црни топ
, црни ловац
, црни скакач
, црни пешак
.У овом вежбању претрага није осетљива на мала и велика слова.
Задајте регуларан израз који поклапа назив било које шаховске фигуре (укључујући и даму), тј. било који од текстова
бела дама
, бели краљ
, бели топ
, бели ловац
, бели скакач
, бели пешак
,црна дама
, црни краљ
, црни топ
, црни ловац
, црни скакач
, црни пешак
.У овом вежбању претрага није осетљива на мала и велика слова.
Границе речи¶
У досадашњим примерима могли смо да приметимо да наведени регуларни изрази поклапају одговарајуће
делове текста, без обзира на то да ли је поклопљени део цела реч или део речи. На пример, израз
\d{4}
поклапа сваки низ од 4 цифре, па и делове бројева који имају више од 4 цифре. Проверимо
ово:
Слично томе, израз top
поклапа делове речи potop
, toplota
и слично:
Поставља се питање шта треба урадити када желимо да регуларан израз поклапа само целе речи. Додавање
подизраза за белине \s
пре и/или после главног израза није добро решење, јер непосредно пре или
после речи могу да се појаве и други карактери осим белина (нпр. знакови интерпункције). Подизраз за карактер
који није слово, тј. [^a-z]
, такође није идеално решење, јер тражена реч може да се појави на
самом почетку или на самом крају текста. Због тога се у регуларним изразима користи посебан запис
\b
, који означава границу речи. Испробајте у претходним примерима израз \b\d{4}\b
уместо
\d{4}
, односно изразе \btop
, top\b
и \btop\b
уместо top
.
Почетак и крај реда¶
У регуларним изразима се користе и посебни записи који поклапају почетак, односно крај реда.
Конкретно, знак ^
поклапа почетак, а знак $
крај реда. Користећи ове записе можемо да задамо
израз који поклапа текст само ако тај текст представља цео ред, или само ако се тај текст налази на
почетку, односно крају реда. Проверите ово, тако што ћете у следећој претрази да испробате изразе
^top
, top$
и ^top$
.
Неки практични примери¶
Регуларан израз за време¶
Пре него што дођемо до неких регуларних израза који поклапају сва исправно записана времена од
00:00
до 23:59
и само таква времена, размотиримо и неке записе који нису сасвим прецизни
и решавају задатак само приближно.
1) Регуларан израз \d\d:\d\d
није потпуно одговарајући опис за време, јер прихвата и неке
текстове који не представљају исправно записано време.
Наведите неки текст који је поклапање за израз \d\d:\d\d
, а не представља исправно
записано време?
Одговор:
2) Регуларан израз [0-2][0-3]:[0-5][0-9]
такође није коректан опис времена. Овај пут имамо
обрнут проблем, а то је да сваки текст који се проналази овим изразом јесте запис времена,
али неки записи времена не би били пронађени.
Наведите неки текст који није поклапање за израз [0-2][0-3]:[0-5][0-9]
, а представља исправно
записано време?
Одговор:
Ако желимо да формирамо регуларан израз који поклапа сва исправна времена и при томе само њих, потребно
је да саставимо прецизан опис дозвољених записа. Између осталог, требало би прецизирати да ли се записи
попут 4:55
сматрају исправним, или инсистирамо да се сати увек изражавају двоцифреним бројем, што
укључује водећу нулу ако је потребна.
Размотримо прво случај са бројем сати који је увек двоцифрен:
ако је прва цифра у броју сати
0
или1
, друга цифра може да буде било којаако је прва цифра у броју сати
2
, друга мора да буде из опсега0-3
Закључујемо да број сати може да се опише било којим од регуларних израза (0[0-9]|1[0-9]|2[0-3])
,
([0-1][0-9]|2[0-3])
, или ([0-1]\d|2[0-3])
.
Даље, у броју минута прва цифра мора да буде из опсега 0-5
, а друга може да буде било која.
Тиме долазимо до израза за комплетан запис времена са бројем сати који је увек двоцифрен, нпр.
([0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]
или ([0-1]\d|2[0-3]):[0-5]\d
.
Уколико изразом желимо да допустимо и записе времена у којим је број сати једноцифрен, можемо да
користимо један од израза (\d|0\d|1\d|2[0-3]):[0-5]\d
, ([0-1]?[0-9]|2[0-3]):[0-5][0-9]
и
сличних.
Вежбање¶
Речи које почињу словом s¶
Задајте регуларан израз који поклапа све речи које почињу словом s
.
У овом вежбању, реч је секвенца слова, пре и после које могу да се нађу
почетак реда, крај реда, знаци интерпункције или белине.
У овом вежбању претрага није осетљива на мала и велика слова.
Датуми¶
Задајте регуларан израз који поклапа све датуме у било ком од облика dd.mm.gg.
, dd.mm.gggg.
,
dd.mm.
, dd.m.
, d.mm.
, d.m.
. Допуштени су и непостојећи датуми, попут 31.04.
и слично, тј. дозвољено је да у наведеним схемама уместо слова d
, m
и g
стоје било
које цифре. Подразумева се да је запис датума једини текст у том реду.
IP адресе¶
Задајте регуларан израз који поклапа IP адресе по стандарду IPV4. По овом стандарду, IP адреса се састоји од 4 цела броја из опсега 0-255, раздвојена тачкама. Водеће нуле могу а не морају да се користе. Ако се користе водеће нуле, број има тачно три цифре. Подразумева се да је запис IP адресе једини текст у том реду.
MAC адресе¶
Задајте регуларан израз који поклапа све MAC адресе. MAC адреса се састоји од 6 група по две хексадекадне цифре, при чему су групе раздвојене цртицама или двотачкама. Подразумева се да је запис MAC адресе једини текст у том реду.
Неисправна времена¶
У примеру у коме смо формирали регуларан израз за време, поставили смо вам два питања. Једно од њих је било ово питање:
Наведите неки текст који је поклапање за израз \d\d:\d\d
, а не представља исправно
записано време?
Одговор:
Одговор који уносите проверава се помоћу регуларних израза. Захваљујући томе, употребљена компонента
је у стању да прихвати сваки тачан одговор, а не само неке. Осим тога, ова компонента на различите
нетачне одговоре даје различите коментаре. Можете, на пример, да проверите да за исправна времена
(који су једна врста нетачног одговора) добијате један коментар, а за текст који није поклапање израза
\d\d:\d\d
(друга врста нетачног одговора) други коментар.
Ваш задатак овде је да задате регуларан израз, који може да се искористи за препознавање
тачних одговора на претходно питање. То значи да израз треба да прихвата само неисправна
времена, која су поклапање за израз \d\d:\d\d
.
Подсетник¶
Знак
|
служи да раздвоји алтернативе, a може да се комбинује са заградама ради формирања сложенијих израза.Знак
\b
представља границу речи.Знак
^
представља почетак реда.Знак
$
представља крај реда.
Израз |
Примери поклапања |
Примери непоклапања |
---|---|---|
Крушев((ац)|(ца)|(цу)) |
|
|
\btop\b |
|
|
\btop[a-z]* |
|
|