Ц ++

Основе регуларног изражавања на језику Ц ++

Основе регуларног изражавања на језику Ц ++
Размотрите следећу реченицу под наводницима:

„Ево мог човека."

Овај низ се можда налази у рачунару и корисник ће можда желети да зна има ли реч „човек“. Ако има реч мушкарац, он ће тада можда желети да промени реч „мушкарац“ у „жена“; тако да низ треба да гласи:

„Ево моје жене."

Много је других жеља попут ових од корисника рачунара; неки су сложени. Регуларни израз, скраћено, регуларни израз, предмет је рјешавања ових проблема помоћу рачунара. Ц ++ долази са библиотеком која се зове регуларни израз. Дакле, Ц ++ програм за руковање регуларним изразом треба да започне са:

#инцлуде
#инцлуде
коришћење простора имена стд;

Овај чланак објашњава основе регуларног изражавања у језику Ц++.

Садржај чланка

  • Основе редовног изражавања
  • Шаблон
  • Класе карактера
  • Подударање празних простора
  • Тачка (.) у Обрасцу
  • Подударање понављања
  • Матцхинг Алтернатион
  • Подударање почетка или краја
  • Груписање
  • Ицасе и мултилине регек_цонстантс
  • Поклапање са целим циљем
  • Матцх_ресултс Објецт
  • Позиција меча
  • Претражите и замените
  • Закључак

Основе редовног изражавања

Регек

Низ попут „Ево мог човека.”Горе је циљни низ или циљни низ или једноставно циљ. „Човек“, за којим се трагало, је регуларни израз, или једноставно, регуларни израз.

Матцхинг

Каже се да се подударање догађа када се пронађе реч или фраза за којом се тражи. Након подударања, може се извршити замена. На пример, након што се изнад налази „мушкарац“, може га заменити са „жена“.

Једноставно подударање

Следећи програм показује како се подудара реч „човек“.

#инцлуде
#инцлуде
коришћење простора имена стд;
инт маин ()

реггекс рег ("човек");
иф (регек_сеарцх ("Ево мог човека.", рег))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;
ретурн 0;

Функција регек_сеарцх () враћа труе ако постоји подударање и враћа фалсе ако се не подудара. Овде функција узима два аргумента: први је циљни низ, а други је објекат регуларног израза. Сам регуларни израз је „човек“, под двоструким наводницима. Прва изјава у функцији маин () формира објекат регуларног израза. Редовни израз је тип, а рег је објект регуларног израза. Излаз горњег програма је "подударан", као што се у циљном низу види "човек". Да се ​​у циљу не види „човек“, регек_сеарцх () би вратио фалсе, а излаз „не би одговарао“.

Излаз следећег кода се „не поклапа“:

реггекс рег ("човек");
иф (регек_сеарцх ("Ево моје израде.", рег))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Није се подударало, јер регуларни израз „човек“ није могао да се пронађе у целом циљном низу, „Ево моје израде."

Шаблон

Регуларни израз „човек“ горе је врло једноставан. Регекси обично нису тако једноставни. Регуларни изрази имају метазнакове. Метазнакови су ликови са посебним значењима. Метазнак је лик о ликовима. Мета карактери Ц ++ регуларног израза су:

^ $ \ . * + ? () [] |

Регекс, са или без метазнака, је образац.

Класе карактера

Угласте заграде

Узорак може имати знакове у угластим заградама. Овим би се одређена позиција у циљном низу подударала са било којим од угластих заграда. Размотрите следеће циљеве:

„Мачка је у соби."
„Слепи миш је у соби."
„Пацов је у соби."

Редовни израз, [цбр] ат би се подударао са мачком у првом циљу. Подударао би се са палицом у другој мети. Одговарао би пацову у трећој мети. То је зато што „мачка“ или „шишмиш“ или „пацов“ почиње са „ц“ или „б“ или „р“. Следећи сегмент кода то илуструје:

реггекс рег ("[цбр] ат");
иф (регек_сеарцх ("Мачка је у соби.", рег))
цоут << "matched" << endl;
иф (регек_сеарцх ("Слепи миш је у соби.", рег))
цоут << "matched" << endl;
иф (регек_сеарцх ("Пацов је у соби.", рег))
цоут << "matched" << endl;

Излаз је:

подударно
подударно
подударно

Распон ликова

Класа, [цбр] у обрасцу [цбр], подударала би се са неколико могућих знакова у циљу. У циљу би се подударао са „ц“ или „б“ или „р“. Ако циљ нема било шта од „ц“ или „б“ или „р“, а затим „ат“, не би било подударања.

Неке могућности попут 'ц' или 'б' или 'р' постоје у опсегу. Опсег цифара од 0 до 9 има 10 могућности, а образац за то је [0-9]. Опсег малих абецеда, од а до з, има 26 могућности, а образац за то је [а-з]. Опсег великих слова, од А до З, има 26 могућности, а образац за то је [А-З]. - није званично метазнак, али у квадратним заградама би означавао опсег. Дакле, следеће производи подударање:

иф (регек_сеарцх ("ИД6ид", регек ("[0-9]")))
цоут << "matched" << endl;

Обратите пажњу на то како је регуларни израз конструисан као други аргумент. Поклапање се догађа између цифре, 6 у опсегу, од 0 до 9, и 6 у циљу, „ИД6ид“. Горњи код је еквивалентан:

иф (регек_сеарцх ("ИД6ид", регек ("[0123456789]")))
цоут << "matched" << endl;

Следећи код даје подударање:

цхар стр [] = "ИД6иЕ";
иф (регек_сеарцх (стр, регуларни израз ("[а-з]")))
цоут << "matched" << endl;

Имајте на уму да је први аргумент овде променљива низа, а не литерал низа. Поклапање је између „и“ у [а-з] и „и“ у „ИД6иЕ“.

Не заборавите да је домет класа. Текст може бити текст десно од опсега или лево од опсега у обрасцу. Следећи код даје подударање:

иф (регек_сеарцх ("ИД2ид је ИД ", регуларни израз (" ИД [0-9] ид ")))
цоут << "matched" << endl;

Подударање је између „ИД [0-9] ид“ и „ИД2ид“. Остатак циљног низа, „је ИД“, у овој ситуацији се не подудара.

Као што се користи у предмету регуларног израза (регекес), реч цласс заправо значи скуп. Односно, један од ликова у сету треба да се подудара.

Напомена: цртица - је метазнак само у угластим заградама, означавајући опсег. То није метазнак у регуларном изразу, изван угластих заграда.

Негација

Класа која укључује опсег може бити негирана. Односно, ниједан од знакова у скупу (класи) не би требало да се подудара. То је означено са ^ метазнаком на почетку обрасца класе, одмах након уводне углате заграде. Дакле, [^ 0-9] значи подударање знака на одговарајућој позицији у циљу, што није ниједан знак у опсегу, укључујући 0 до 9. Дакле, следећи код неће дати подударање:

иф (регек_сеарцх ("0123456789101112", регек ("[^ 0-9]")))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Цифра у опсегу од 0 до 9 може се наћи у било којем од циљних положаја низа, „0123456789101112,“; тако да нема подударања - негације.

Следећи код даје подударање:

иф (претрага_регекса ("АБЦДЕФГХИЈ", регуларни израз ("[^ 0-9]")))
цоут << "matched" << endl;

Ниједна цифра није пронађена у циљу „АБЦДЕФГХИЈ“; па постоји шибица.

[а-з] је опсег изван [^ а-з]. И тако је [^ а-з] негација [а-з].

[А-З] је опсег изван [^ А-З]. И тако је [^ А-З] негација [А-З].

Постоје и друге негације.

Подударање празних простора

"или \ т или \ р или \ н или \ ф је размак. У следећем коду, регуларни израз „\ н“ се подудара са „\ н“ у циљу:

иф (регек_сеарцх ("Реда један.\ р \ нДругог реда.", регуларни израз (" \ н ")))
цоут << "matched" << endl;

Подударање са било којим празним знаком

Узорак или класа који се подударају са било којим празним знаком је, [\ т \ р \ н \ ф]. У следећем коду се подудара „:

иф (регек_сеарцх ("један два", регек ("[\ т \ р \ н \ ф]")))
цоут << "matched" << endl;

Подударање са било којим знаком који није размак

Узорак или класа који се подударају са било којим знаком који није празан је: [^ \ т \ р \ н \ ф]. Следећи код даје подударање јер нема празног простора у циљу:

иф (тражење_регекса ("1234абцд", регек ("[^ \ т \ р \ н \ ф]")))
цоут << "matched" << endl;

Тачка (.) у Обрасцу

Тачка (.) у обрасцу се подудара са било којим ликом, укључујући себе, осим \ н, у циљу. Подударање се производи у следећем коду:

иф (регек_сеарцх ("1234абцд", регек (".")))
цоут << "matched" << endl;

У следећем коду нема подударних резултата јер је циљ „\ н“.

иф (регек_сеарцх ("\ н", регуларни израз (".")))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Напомена: Унутар класе знакова са угластим заградама тачка нема посебно значење.

Подударање понављања

Знак или група знакова може се појавити више пута у циљном низу. Узорак може одговарати овом понављању. Метазнакови, ?, *, + и се користе за подударање понављања у циљу. Ако је к карактер од интереса у циљном низу, тада метазнакови имају следећа значења:

к *: значи подударање 'к' 0 или више пута, тј.е., било који број пута
к +: значи подударање 'к' 1 или више пута, тј.е., најмање једном
Икс? : значи подударање 'к' 0 или 1 пут
к н,: значи подударање са 'к' најмање н или више пута. Обратите пажњу на зарез.
к н: подударање са „к“ тачно н пута
к н, м: подударање са „к“ најмање н пута, али не више од м пута.

Ови метакарактери се називају квантификатори.

Илустрације

*

Знак * се подудара са претходним знаком или претходном групом, нула или више пута. „О *“ се подудара са „о“ у „дог“ циљног низа. Такође се подудара са „оо“ у „боок“ и „лоокинг“. Редовни израз, „о *“ се подудара са „боооо“ у „Животиња бооооед“.”. Напомена: „о *“ се подудара са „диг“, где се „о“ јавља нула (или више) времена.

+

Знак + се подудара са претходним знаком или претходном групом 1 или више пута. Упоредите је са нула или више пута за *. Дакле, регуларни израз, „е +“ се подудара са „е“ у „јести“, где се „е“ јавља једном. „Е +“ се такође подудара са „ее“ у „оваца“, где се „е“ јавља више пута. Напомена: „е +“ се неће подударати са „диг“, јер се у „диг“ „е“ не појављује најмање једном.

?

Тхе ? подудара се са претходним знаком или претходном групом, 0 или 1 пут (и не више). Дакле, „д?”Подудара се са„ диг ”, јер се„ е ”јавља у„ диг ”, нула времена. „Е?”Подудара се са„ сет ”, јер се„ е ”јавља у„ сет ”, једнократно. Напомена: „д?”И даље се подудара са„ овцама ”; мада постоје две речи „овце“. Овде постоји нијанса - погледајте касније.

н,

Ово одговара најмање н узастопних понављања претходног лика или претходне групе. Дакле, регуларни израз, "е 2," се поклапа са два е у циљу, "овца", и три е у циљу "овца". „Е 2,“ се не подудара са „сет“, јер „сет“ има само једно „е“.

н

Ово се подудара са тачно н узастопних понављања претходног лика или претходне групе. Дакле, регуларни израз, „е 2“ се подудара са два „е“ у циљу, „овца“. „Е 2“ се не подудара са „сет“ јер „сет“ има само једно „е“. Па, „е 2“ се подудара са два „е“ у циљу, „овца“. Овде постоји нијанса - погледајте касније.

н, м

Ово одговара неколико узастопних понављања претходног знака или претходне групе, било где од н до м, укључујући. Дакле, „е 1,3“ се не подудара ни са чим у „диг“, који нема „е“. Подудара се са једним „е“ у „сету“, два „е“ у „овцама“, три „е“ у „овцама“ и три „е“ у „овцама“. На последњем мечу постоји нијанса - погледајте касније.

Матцхинг Алтернатион

Размотрите следећи циљни низ у рачунару.

„На фарми се налазе свиње различитих величина.”

Програмер ће можда желети знати има ли овај циљ „козу“, „зеца“ или „свињу“. Код би био следећи:

цхар стр [] = "Фарма има свиње различитих величина.";
иф (регек_сеарцх (стр, регек ("коза | зец | свиња")))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Код даје подударање. Обратите пажњу на употребу знака наизменичног, |. Могу бити две, три, четири и више опција. Ц ++ ће прво покушати да се подудара са првом алтернативом, „јарцем“, на сваком положају знака у циљном низу. Ако не успе са "јарцем", покушава следећу алтернативу, "зец". Ако не успе са „зецом“, покушава следећу алтернативу, „свиња“. Ако „свиња“ не успе, тада Ц ++ прелази на следећу позицију у циљу и поново започиње са првом алтернативом.

У горњем коду подудара се „свиња“.

Подударање почетка или краја

Почетак


Ако је ^ на почетку регуларног израза, тада се регуларни израз може подударати с почетком текста циљног низа. У следећем коду почетак циља је „абц“, који се подудара:

иф (регек_сеарцх ("абц анд деф", регек ("^ абц")))
цоут << "matched" << endl;

У следећем коду се не подудара:

иф (регек_сеарцх ("Да, абц и деф", регек ("^ абц")))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Овде „абц“ није на почетку мете.

Напомена: Циркумфлексни знак, '^', је метазнак на почетку регуларног израза, који се подудара са почетком циљног низа. И даље је метазнак на почетку класе знакова, где негира класу.

Крај

Ако је $ на крају регуларног израза, тада се регуларни израз може подударати са завршним текстом циљног низа. У следећем коду крај циља је „киз“, који се подудара:

иф (регек_сеарцх ("увв и киз", регек ("киз $")))
цоут << "matched" << endl;

У следећем коду се не подудара:

иф (регек_сеарцх ("увв и киз финал", регек ("киз $")))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Овде „киз“ није на крају мете.

Груписање

Заграде се могу користити за груписање знакова у образац. Размотрите следећи регуларни израз:

„концерт (пијаниста)“

Овде је група „пијаниста“ окружена метакарактерима (и). То је заправо подгрупа, док је „концерт (пијаниста)“ цела група. Узмите у обзир следеће:

„Тхе (пијаниста је добар)“

Овде је подгрупа или подниз „пианиста добар“.

Под-низови са заједничким деловима

Књиговођа је особа која се брине о књигама. Замислите библиотеку са књиговођом и полицом за књиге. Претпоставимо да се један од следећих циљних низова налази у рачунару:

„Библиотека има полицу са књигама којој се диве.";
„Ево књиговође.";
„Књиговођа ради са полицом за књиге.";

Претпоставимо да програмера не занима која је од ових реченица у рачунару. Ипак, његов интерес је да зна да ли је „полица за књиге“ или „књиговођа“ присутан у било којем циљном низу у рачунару. У овом случају, његов регуларни израз може бити:

"полица за књиге | књиговођа."

Користећи алтернацију.

Приметите да је „књига“, која је заједничка за обе речи, укуцана два пута, у две речи у обрасцу. Да не би два пута куцали „књига“, регуларни израз би било боље написати као:

"књига (полица | чувар)"

Овде, група, „полица | чувар“ Метазнак наизменично је и даље коришћен, али не за две дуге речи. Употребљаван је за два завршна дела две дугачке речи. Ц ++ третира групу као ентитет. Дакле, Ц ++ ће тражити „полицу“ или „чувара“ који долази одмах након „књиге“. Излаз следећег кода се „подудара“:

цхар стр [] = "Библиотека има полицу са књигама којој се диве.";
иф (регек_сеарцх (стр, регек ("књига (полица | чувар)")))
цоут << "matched" << endl;

„Полица за књиге“, ​​а не „књиговођа“ се подударају.

Ицасе и мултилине регек_цонстантс

ицасе

Подударање подразумевано разликује велика и мала слова. Међутим, то се може учинити неосетљивим на велика и мала слова. Да бисте то постигли, користите константу регек :: ицасе, као у следећем коду:

иф (регек_сеарцх ("Феедбацк", регек ("феед", регек :: ицасе)))
цоут << "matched" << endl;

Излаз се „подудара“. Дакле, „Повратна информација“ са великим словом „Ф“ подудара се са „феед“ са малим словом „ф“. „Регек :: ицасе“ је направљен као други аргумент конструктора регек (). Без тога изјава не би довела до подударања.

Мултилине

Узмите у обзир следећи код:

цхар стр [] = "линија 1 \ н линија 2 \ н линија 3";
иф (регек_сеарцх (стр, регек ("^.* $ ")))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Излаз се „не поклапа“. Редовни израз, „^.* $, ”Подудара се са циљним низом од почетка до краја. „.* ”Значи било који знак осим \ н, нула или више пута. Дакле, због знакова новог реда (\ н) у циљу, није било подударања.

Циљ је вишередни низ. Како би '.'да би се подударао са знаком нове линије, мора се направити константа „регек :: мултилине“, други аргумент конструкције регек (). Следећи код то илуструје:

цхар стр [] = "линија 1 \ н линија 2 \ н линија 3";
иф (регек_сеарцх (стр, регек ("^.* $ ", регуларни израз :: вишередни)))
цоут << "matched" << endl;
иначе
цоут << "not matched" << endl;

Подударање низа целе циљне групе

Да би се подударао са целим циљним низом, који нема знак новог реда (\ н), може се користити функција регек_матцх (). Ова функција се разликује од регек_сеарцх (). Следећи код то илуструје:

цхар стр [] = "прва друга трећа";
иф (регек_матцх (стр, регек (".* друго.* ")))
цоут << "matched" << endl;

Овде се подудара. Међутим, имајте на уму да се регуларни израз подудара са целим циљним низом, а циљни низ нема '\ н'.

Матцх_ресултс Објецт

Функција регек_сеарцх () може узети аргумент између циља и објекта регуларног израза. Овај аргумент је објект матцх_ресултс. Читав подударни (деловни) низ и под-низови који се подударају могу бити познати са њим. Овај објекат је посебан низ са методама. Тип објекта матцх_ресултс је цматцх (за стринг литерале).

Добијање утакмица

Узмите у обзир следећи код:

цхар стр [] = "Жена коју сте тражили!";
цматцх м;
иф (регек_сеарцх (стр, м, регек ("в.м.н ")))
цоут << m[0] << endl;

Циљни низ има реч „жена“. Резултат је „жена“, што одговара регуларном изразу, „в.м.н ”. Код индекса нула, специјални низ садржи једино подударање, а то је „жена“.

Са опцијама класе, само се први подниз који се налази у циљу шаље у посебан низ. Следећи код то илуструје:

цматцх м;
иф (регек_сеарцх ("Пацов, мачка, слепи миш!", м, регуларни израз (" [бцр] ат ")))
цоут << m[0] << endl;
цоут << m[1] << endl;
цоут << m[2] << endl;

Излаз је „пацов“ из индекса нула. м [1] и м [2] су празни.

Са алтернативама, само се први подниз који се налази у циљу шаље у посебан низ. Следећи код то илуструје:

иф (регек_сеарцх ("Зец, јарац, свиња!", м, регуларни израз (" коза | зец | свиња ")))
цоут << m[0] << endl;
цоут << m[1] << endl;
цоут << m[2] << endl;

Резултат је „зец“ из индекса нула. м [1] и м [2] су празни.

Груписања

Када су укључене групе, комплетан образац који се подудара иде у нулу ћелије посебног низа. Следећи пронађени подниз улази у ћелију 1; подниз који следи, иде у ћелију 2; и тако даље. Следећи код то илуструје:

иф (регек_сеарцх ("Најбољи продавац књига данас!", м, регуларни израз (" боок ((сел) (лер)) ")))
цоут << m[0] << endl;
цоут << m[1] << endl;
цоут << m[2] << endl;
цоут << m[3] << endl;

Излаз је:

продавац књига
продавац
сел
лер

Имајте на уму да група (продавац) долази пре групе (сел).

Позиција меча

Положај подударања за сваки подниз у низу цматцх може бити познат. Бројање почиње од првог знака циљног низа, на позицији нула. Следећи код то илуструје:

цматцх м;
иф (регек_сеарцх ("Најбољи продавац књига данас!", м, регуларни израз (" боок ((сел) (лер)) ")))
цоут << m[0] << "->" << m.position(0) << endl;
цоут << m[1] << "->" << m.position(1) << endl;
цоут << m[2] << "->" << m.position(2) << endl;
цоут << m[3] << "->" << m.position(3) << endl;

Обратите пажњу на употребу својства поситион са индексом ћелије као аргумент. Излаз је:

књижар-> 5
продавац-> 9
сел-> 9
лер-> 12

Претражите и замените

Нова реч или фраза могу заменити подударање. За ово се користи функција регек_реплаце (). Међутим, овог пута је низ у којем долази до замјене објект низа, а не литерал низа. Дакле, библиотека стрингова мора бити укључена у програм. Илустрација:

#инцлуде
#инцлуде
#инцлуде
коришћење простора имена стд;
инт маин ()

стринг стр = "Ево, долази мој човек. Ено твог човека.";
стринг невСтр = регек_реплаце (стр, регек ("мушкарац"), "жена");
цоут << newStr << endl;
ретурн 0;

Функција регек_реплаце (), како је овде кодирано, замењује сва поклапања. Први аргумент функције је циљ, други је објекат регуларног израза, а трећи је заменљиви низ. Функција враћа нови низ, који је циљ, али који има замену. Излаз је:

„Ево моје жене. Оде твоја жена.”

Закључак

Регуларни израз користи обрасце за подударање поднизова у низу циљне секвенце. Обрасци имају метазнакове. Уобичајене функције за регуларне изразе Ц ++ су: регек_сеарцх (), регек_матцх () и регек_реплаце (). Редовни израз је образац у двоструким наводницима. Међутим, ове функције узимају као аргумент објект регуларног израза, а не само регуларни израз. Редовни израз мора бити направљен од објекта регуларног израза да би га ове функције могле користити.

Водич за сенку Томб Раидера за Линук
Схадов оф тхе Томб Раидер је дванаести додатак серији Томб Раидер - акцијско-авантуристичкој игри коју је створио Еидос Монтреал. И критичари и фанови...
Како појачати ФПС у Линуку?
ФПС је скраћеница за Фрејмова у секунди. Задатак ФПС-а је да мери брзину кадрова у репродукцијама видео записа или играчким перформансама. Једноставни...
Најпопуларније лабораторијске игре Оцулус Апп
Ако сте власник Оцулус слушалица, онда морате бити упознати са бочним учитавањем. Бочно учитавање је поступак инсталирања не-продавничког садржаја на ...