Блог за системна администрация. Статии за Linux, Windows, NetApp съхранение и виртуализация.

регулярни
Добро време, гости!

В днешната статия искам да засегна такава огромна тема като Регулярни изрази. Мисля, че всички знаят, че темата за регулярните изрази (както се наричат ​​регулярни изрази на жаргон) е огромна в обема на една публикация. Затова ще се опитам накратко, но възможно най-ясно да събера мислите си и да ви ги предам в моя блог.

Като начало има няколко вкуса на регулярните изрази:

1. Традиционни регулярни изрази (те също са основни, основни и основни регулярни изрази (BRE))

  • синтаксисът на тези изрази е определен за остарял, но въпреки това той все още е широко разпространен и се използва от много UNIX помощни програми
  • Основните регулярни изрази включват следните метасимволи (вижте техните значения по-долу):
    • .
    • []
    • [^]
    • ^
    • $
    • *
    • \ < \>- начална версия за < >(удължено)
    • \ (\) - оригинал за () (в разширение)
    • \ n, където n е число от 1 до 9
  • Характеристики на използването на тези метасимволи:
    • Звездичката трябва да следва израз, който съвпада с един символ. Пример: [xyz] * .
    • Изразът \ (блок \) * трябва да се счита за невалиден. В някои случаи тя съвпада с нула или повече повторения на блоковия низ. В други съвпада с линейния блок * .
    • В рамките на клас знаци специалните знаци обикновено се игнорират. Специални случаи:
    • За да добавите знак ^ към набор, той не трябва да се поставя първо там.
    • За да добавите символ - към набор, той трябва да бъде поставен там първи или последен. Например:
      • Модел на DNS име, който може да включва букви, цифри, минус и разделителни периоди: [-0-9a-zA-Z.];
      • всеки знак с изключение на минус и цифра: [^ -0-9] .
    • За да добавите символа [или] към набора, той трябва първо да бъде поставен там. Например:
      • [] [ab] съвпада], [, a или b .

2. Разширени регулярни изрази (те също са разширени регулярни изрази (ERE))

  • Синтаксисът за тези изрази е същият като за основните изрази, с изключение на:
    • Премахна използването на наклонени черти за метасимволи < >и () .
    • Обратна наклонена черта преди метасимвол отменя специалното му значение.
    • Отхвърлено теоретично нередовен строителство \ n .
    • Добавени са метасимволите +,?, | .

3. Регулярни изрази, съвместими с Perl (те също са съвместими с Perl регулярни изрази (PCRE))

  • имат по-богат и в същото време предсказуем синтаксис дори от POSIX ERE, поради което често се използва от приложенията.

След това нека поговорим малко за синтаксис на регулярния израз .

Регулярни изрази се състои от шаблони или по-скоро задайте шаблон Търсене. Шаблонът се състои на правила търсения, които са съставени от знаци и метасимволи.

Правила за търсене дефинирани от следното операции:

Изброяване |

Вертикалната лента (|) разделя валидните опции, можем да кажем - логично ИЛИ. Например "сив | сив" съвпада със сив или сив.

Групиране или обединяване ()

Скобите се използват за определяне на обхвата и приоритета на операторите. Например "сив | сив" и "gr (a | e) y" са различни модели, но и двата описват набор, съдържащ сиво и сиво.

Количествено определяне <>? * +

Кванторът след символ или група определя колко пъти предшественик може да възникне израз.

общ израз, повторения могат да бъдат от m до n включително.

общ израз, m или повече повторения.

общ израз, не повече от n повторения.

гладка n повторения.

Въпросителният знак означава 0 или 1 пъти, същото като . Например "colou? R" съвпада както с цвят, така и с цвят.

Звездичка означава 0, 1 или произволно число пъти ( ). Например "go * gle" съвпада с ggle, gogle, google и т.н.

Плюс означава поне 1 пъти ( ). Например „go + gle“ съответства на gogle, google и т.н. (но не и ggle).

Специфичният синтаксис за тези регулярни изрази зависи от изпълнението. (т.е. в основни регулярни изрази символите се избягват с обратна наклонена черта)

Метасимволи, с прости думи това са символи, които не съответстват на реалното им значение, тоест символ. (point) не е точка, а всеки един символ и т.н. моля запознайте се с метасимволите и техните значения:

  • Звездичка след израз, съвпадащ с единичен знак нула или Повече ▼копия от този (предходен) израз. Например „[xyz] *“ съответства на празен низ, „x“, „y“, „zx“, „zyx“ и т.н.
  • \ n *, където n е цифра от 1 до 9, съответства на нула или повече повторения, за да съответства на n-ия маркиран подизраз. Например "\ (a. \) C \ 1 *" съвпада с "abcab" и "abcaba", но не и "abcac".

. Израз, затворен в "\ (" и "\)", последван от "*", трябва да се счита за невалиден. В някои случаи тя съвпада с нула или повече случаи на низа, затворен в скоби. В други съвпада с израз, затворен в скоби, като се има предвид "*".

Метасимволите ни помагат да използваме различни съвпадения. Но как да представите метасимвол с редовен символ, т.е. символът [(квадратна скоба) като стойност в квадратна скоба? Просто:

  • трябва да се предшества (щит) метасимвол (. * + \? [] < >) с обратна наклонена черта. Например \. или\[

В регулярния израз има такова нещо като:

Алчност регекс

Ще се опитам да го опиша възможно най-ясно. Да приемем, че искаме да намерим всички HTML тагове в някакъв текст. След като локализираме задачата, искаме да намерим стойностите, затворени между тях, заедно с тези много скоби. Но знаем, че етикетите имат различна дължина и самите маркери, поне 50 парчета. За да ги изброите всички, заграждането им в метасимволите [] е твърде отнемаща време задача. Но знаем, че имаме израз. * (Звездичка с точка), който характеризира произволен брой символи в низа. Използвайки този израз, ще се опитаме да намерим в текста (

така, Как да създадете RAID ниво 10/50 на LSI MegaRAID контролер (важи и за: Intel SRCU42x, Intel SRCS16):

) всички стойности между. В резултат ВСИЧКИ низ ще съответства на този израз. защо, защото регулярният израз е ЛЕКОРЕН и се опитва да улови ВСЯКИ ВСИЧКИ броя символи между съответно целия низ, започвайки Така. и завършва .

ще принадлежи на това правило!

Надяваме се, че примерът показва какво е алчността. За да се отървете от тази алчност, можете да продължите по следния път:

  • вземете предвид символите, които не съответстват на желания модел (например:] *> за горния случай)
  • да се отървете от алчността, като добавите дефиницията на квантор като не-алчен:
    • *? - "не е алчен" ("мързелив") еквивалент *
    • +? - "Не е алчен" ("мързелив") еквивалент +
    • ? - "Не е алчен" ("мързелив") еквивалент
    • .*? - "не е алчен" ("мързелив") еквивалент. *

Искам да допълня всичко по-горе с разширения синтаксис на регулярния израз:

Регулярните изрази в POSIX са подобни на традиционния синтаксис на Unix, но с добавяне на някои метасимволи:

Плюсът показва това предишен символ или Група може да се повтори един или повече пъти. За разлика от звездичката е необходимо поне едно повторение.

Въпросният знак прави предишен знак или група по избор. С други думи, в съответния ред, то може да отсъства или да присъства гладка един време.

Вертикалната лента разделя алтернативните регулярни изрази. Един символ определя две алтернативи, но може да има повече от тях, достатъчно е да се използват повече вертикални ленти. Не забравяйте, че този оператор използва възможно най-много от израза. Поради тази причина алтернативният оператор най-често се използва в скоби.

Премахнато е и използването на обратни наклонени черти: \ става и \ (... \) става (...).

В края на публикацията ето няколко примера за използване на регулярни изрази:

Поздрави, Mc.Sim!

Например "go * gle" съвпада с ggle, gogle, google и т.н.

ggle не може да съвпадне.
гугъл
отидете [всеки знак] gle

Съгласен съм. Грешка. Благодаря - поправено

2artem и 2 Mc.Sim
* е квантор, а не всеки символ. Всеки знак е „.“
go * gle означава g (o или NULL или "произволен брой знаци" o ") gle
според този ggle - също ще бъде намерен

Мисля, че вашият пример не е съвсем правилен, бих перифразирал фразите ви от:

Всеки знак е „.“

Всякакви един (ненулевият) знак е „.“

go * gle означава g (o или NULL или „произволен брой символи„ o “) gle

go * gle означава gотносно( NULL или „произволен брой символи„ o “или друг знак“) gle

Съжалявам, но грешите. Кванторът се отнася до последния знак и 0 означава, че няма такъв
Тези. ggle ще бъде намерен чрез go * gle низ за заявка, както и от gogle, които са идентични

В езиците за програмиране на Perl тази технология се използва изцяло, както в Pyton, който сте посочили.
Книги от 600 страници са написани на регулярни изрази.) Вземете това просто като измама. Освен това можете да прочетете много за това в Интернет. Но като цяло е напълно възможно в бъдеще ръцете в крайна сметка да стигнат до статия ...

Звездичка означава 0, 1 или произволен брой пъти (). например, "G * gle" съвпада с ggle, gogle, google и т.н.

Очевидно сте имали предвид "go * gle" (o - пропуснат)

благодаря на всички, google коригира))

Как да намеря 3-цифрено шестнадесетично число, използвайки grep ? Наистина имам нужда от помощ

Мисля, че тук е необходимо по-съществено разбиране.
Примерен текст като.

Mc.Sim, първо благодаря за толкова задълбочено обяснение на регулярния израз
такъв въпрос, опитвам се да намеря всички файлове, чиито имена съдържат "krakozyabra", например:

# ls -1
®¨®§¶
®¨®§¶.jpg
test.txt
Руски txt

Използвам find -regex за търсене. Трябва веднага да кажа, че convmv не може да се използва, тъй като се изисква двойно преобразуване
Знам как да дешифрирам "krakozyabry", но не мога да напиша правилния регулярен израз.
опитвам се да направя това:
намери ./ -maxdepth 1 -regextype posix-extended -not -regex "\. \/[a-zA-Za-zaA-Za \ d]"
Редовно искам да намеря всичко, което има първите 2 два знака "./", след това символа на английската/руската азбука или число. Всичко, което идва след това, трябва да се игнорира, защото като правило името на файла е "прецакано", но не и краят.

Кажете ми къде е грешката в регулярния израз