Back to site

Уводзіны ў падручнік

Уласн гісторыя: На гэтай старонцы, здаецца, даволі шырока чытаць, але толькі час ад часу атрымлівае ахвяраванні на Paypal вышэй спасылцы. Трагедыя суполак і ўсё, што... Але ўсё ж, калі любы з вас хацелі б ахвяраваць даляр ці два, я цаню гэта?
Ва ўсякім выпадку, гэты ўрок быў упершыню апублікаваны DeveloperWorks IBM. Гэтая вэрсія ўтрымлівае некалькі невялікіх змен, што чытачы выказалі здагадку, паколькі арыгінал публікацыі. Пашыраны і абноўлены варыянт можна знайсці ў маёй кнізе, апрацоўкі тэксту ў Python

Навігацыя

Гэты падручнік з'яўляецца толькі адзін вялікі файл HTML, з некалькі графіка, выкарыстоўваная на гэтым шляху. Проста пракруціць ўніз, каб прачытаць яго. Друк можа сапсаваць некаторыя ўрокі ў сярэдзіне - але потым, вы не плаціце значна каб атрымаць гэта.

Хто гэта падручнік для?

Гэты падручнік прызначаны для карыстальнікаў і праграмістаў, якія пачалі працаваць з інструментамі, якія выкарыстоўваюць рэгулярныя выразы, але якія не зусім камфортна з тонкасцях з іх. Нават тыя карыстальнікі, якія, магчыма, выкарыстоўваць рэгулярныя выразы ў мінулым, але забыліся некаторыя дэталі могуць атрымаць выгаду з гэтага як перападрыхтоўкі.

Пасля завяршэння гэтага ўрока вы яшчэ не будуць экспертам у выкарыстанні рэгулярных выразаў, каб найлепшым чынам. Але гэты падручнік у спалучэнні з мноствам практыцы з рознай выпадках гэта ўсё, Вы павінны быць экспертам. Паняцці рэгулярных выразаў надзвычай простым і эфектыўным... гэта іх дадатак, якое займае пэўную працу.

Што ж такое рэгулярнае выраз, так ці інакш?

Чытаць падручнік, каб атрымаць доўгі адказ. Кароткі адказ такі, што рэгулярнае выраз кампактны спосаб апісання складаных мадэляў у тэкстах. Вы можаце выкарыстоўваць іх для стварэння шаблонаў для пошуку і, як толькі знойдзены, для змены мадэлі ў складаных выпадках. Яны таксама могуць быць выкарыстаны для запуску праграмных дзеянняў, якія залежаць ад мадэлі.

Насмешлівы каментар праграмістамі, варта задумацца: "Часам у вас ёсць праблемы праграмавання і здаецца, што лепшым рашэннем з'яўляецца выкарыстанне рэгулярных выразаў, а цяпер у вас ёсць дзве праблемы." Рэгулярныя выразы дзіўна магутны і глыбока выразны. Вось менавіта таму, запісаўшы іх гэтак жа памылак, як напісанне любы іншы складаны код праграмавання. Гэта заўсёды лепш вырашаць сапраўды простая задача ў просты спосаб, калі вы выходзіце за межы простага, думаць аб рэгулярных выразах.

Якія інструменты выкарыстоўваць рэгулярныя выразы?

Вялікая колькасць інструментаў ўключае рэгулярныя выразы як частку сваёй функцыянальнасці. Unix-арыентаваных інструментаў каманднага радка, як grep, sed, ??і awk асноўным абалонкай для рэгулярнай апрацоўкі выразы. Шматлікія тэкставыя рэдактары дазваляюць пошуку і/або замены на аснове рэгулярных выразаў. Многія мовы праграмавання, асабліва моў сцэнарыяў, такіх як Perl, Python, TCL і, будаваць рэгулярныя выразы ў сэрцы мове. Нават самыя каманднага радка абалонкі, такія як Bash або Windows-кансолі дазваляюць абмежаваныя рэгулярныя выразы ў якасці часткі іх сінтаксіс каманды.

Ёсць некалькі варыянтаў у сінтаксісе рэгулярных выразаў паміж рознымі інструментамі, якія іх выкарыстоўваюць. Некаторыя прылады дадаць пашыраныя магчымасці, якія не даступныя ўсюды. Увогуле, для найпростых выпадкаў, гэты ўрок будзе выкарыстоўваць прыклады заснаваныя на grep або sed. Для некалькі больш экзатычных магчымасцяў, Perl або Python прыкладаў будзе абраны. Па большай частцы, прыклады будуць працаваць у любым месцы, але праверыць дакументацыю на свой уласны інструмент для змены сінтаксісу і магчымасцяў.

Звярніце ўвагу на прэзентацыю

Для мэт прадстаўлення прыклады ў гэтым падручніку, рэгулярныя выразы апісаны будзе акружаны касую рысу. Гэты стыль размежавання рэгулярных выразаў выкарыстоўваецца sed, awk, Perl і іншыя інструменты. Напрыклад, прыклад можна згадаць:

/[AZ]+(abc|xyz)*/

Чытайце наперад, каб зразумець гэта, напрыклад, цяпер проста разумею, што фактычнае рэгулярны выраз ўсё паміж касой рысы.

Шматлікія прыклады будуць суправаджацца ілюстрацыяй таго, што паказвае, рэгулярнае выраз, і тэкст, які будзе вылучаны для кожнага матчу на гэта выраз.

Кантакты

Дэвід Мерца гэта пісьменнік, праграміст, і настаўнік, які заўсёды імкнецца палепшыць свае сувязі для чытачоў (і падручнік установам). Ён вітае любыя каментары, калі ласка, накіроўвайце іх на <mertz@gnosis.cx>.

Куды пайсці адсюль...

Пасля завяршэння гэтага ўрока вы бачылі асновы (і трохі некаторыя складаныя тэмы) рэгулярных выразаў. Лепш за ўсё рабіць далей, каб пачаць іх выкарыстоўваць у рэальных жыццёвых праблем. Першае, што трэба глядзець на гэта ў дакументацыі, якая суправаджае канкрэтны інструмент вы выкарыстоўваеце. Акрамя таго, колькасць друкаваных кніг маюць добрыя тлумачэння рэгулярных выразаў, часта, як ажыццяўляюцца канкрэтныя інструменты. Некаторыя кнігі аўтар гэтага падручніка былі выкарыстаны матэрыялы з з'яўляюцца:

  • Рэгулярныя выразы, Фридл, Джэфры EF, O'Reilly, Cambridge, MA 1997 года.
  • SED і AWK, Дэйл і Арнольд Роббінс Догерці, O'Reilly, Cambridge, MA 1997 года.
  • Праграмаванне Perl, Лары Уол, Том Кристиансен і Рэндал Л. Шварц, O'Reilly, Cambridge, MA 1996 года.
  • TCL/TK ў двух словах, Павел Рэйнс і Джэф Трантер, O'Reilly, Cambridge, MA 1999 года.
  • Python Pocket Reference, Марк Лутц, O'Reilly, Cambridge, MA 1998 года.
  • Практычнае кіраўніцтва па Linux, Марк Г. Собелл, М.: Свет, М. 1997.

Адпаведныя шаблоны ў тэксце: Асновы


Знакавых литералов


/ /

М Ry ч D Little L МБ.
І ўсюды я т м ж/д
пайшоў, L MB W S упэўнены
ісці.


/ Марыя /

У Мэры быў баранчык.
І ўсюды, што Марыя
пайшоў, ягня быў упэўнены,
ісці.

    

Самы просты шаблон суправаджаецца рэгулярны выраз літарны знак ці паслядоўнасць літарных знакаў. Усё, што ў мэтавай тэкст, які складаецца роўна з гэтых знакаў у сапраўды паказаным парадку будуць супадаць. Ніжні рэгістр знакаў не супадае з верхняй версіі выпадку, і наадварот. Прасторы ў рэгулярнае выраз, дарэчы, запалкі літаральным прастору ў мішэні (гэта ў адрозненне ад большасці моў праграмавання або сродкі каманднага радка, дзе прасторы асобных ключавых слоў).

"Кіраванае" знакаў литералы


/.* /

Спецыяльныя сімвалы павінны быць экранаваны.*

/ \.\* /
Спецыяльныя сімвалы павінны быць экранаваны .*
    

Колькасць знакаў маюць адмысловае значэнне ў рэгулярных выразах. Сімвал з асаблівым сэнсам можна падабраць, але для гэтага вы павінны спачатку трэба з зваротнай касой рысы (гэта ўключае зваротную касую рысу сябе: каб адпавядаць адзін зваротны слеш ў мэту, рэгулярнае выраз павінна ўключаць "\ \").

Пазіцыйныя спецыяльныя сімвалы


/ ^ Марыі /

У Мэры быў баранчык.
І ўсюды, што Марыя
пайшоў, ягня быў упэўнены,
ісці.


/ Мэры $ /

У Мэры быў баранчык.
І ўсюды, што Марыя
пайшоў, ягня быў упэўнены,
ісці.

    

Два спецыяльных сімвалаў выкарыстоўваюцца практычна ва ўсіх рэгулярных выразаў інструменты, каб адзначыць пачатак і канец радка: ўстаўкі (^) і dollarsign ($). Каб адпавядаць ўстаўкі або dollarsign як літаральны характар, вы павінны пазбавіцца ад яе (г.зн. перад ім зваротную касую рысу "\").

Цікавая рэч аб карэткі і dollarsign з'яўляецца тое, што яны адпавядаюць нулявой шырыні мадэлі. Гэта значыць даўжыня радка суправаджацца ўстаўкі або dollarsign само па сабе з'яўляецца нуль (але астатняя частка рэгулярнага выразы можа яшчэ залежыць ад матчу з нулявой шырынёй). Многія інструменты рэгулярнага выказвання з'яўляюцца яшчэ адным нулявой шырыні карціны ў слова-мяжы (\ б). Словы могуць быць падзеленыя прабеламі, як прабелы, табуляцыі, новыя радкі, або іншыя сімвалы, такія як нулі; слова мяжой шаблоне фактычнай кропкі, дзе слова пачынаецца або заканчваецца, не асабліва прабелы.

"Сімвал" характар


/. /

Ма Ry га D мала-ла-МБ.
І ўсюды т/га T Ма Ry
пайшоў, мб ва-ла ўпэўненая,
ісці.

У рэгулярных выразах, перыяд можа стаяць любы знак. Як правіла, сімвал новай радкі не ўваходзіць, але большасць інструментаў маюць дадатковы перамыкаецца ў сілу ўключэння сімвал новай радкі таксама. Выкарыстанне ў перыяд карціна спосаб патрабуе, што "нешта", адбываецца тут, не маючы вырашыць, што.

Карыстальнікі, якія знаёмы з DOS каманднага радка маскі будуць ведаць, пытальнік, як запаўненне ролю "некаторых знакаў" у каманду маскі. Але ў рэгулярных выразах, пытальнік мае рознае значэнне, і перыяд выкарыстоўваецца ў якасці шаблону.

Групоўка рэгулярных выразаў


/ (Марыя) () (была) /

У Мэры быў баранчык.
І ўсюды, што Марыя
пайшоў, ягня быў упэўнены,
ісці.

    

Рэгулярнае выраз можа мець літарных знакаў у ёй, а таксама нулявой шырыні пазіцыйных мадэляў. Кожны літарны знак ці пазіцыйнага карціна атама ў рэгулярным выразе. Вы таксама можаце згрупаваць некалькі атамаў разам у невялікі рэгулярнае выраз, якое з'яўляецца часткай больш буйнога рэгулярнага выразы. Хтосьці можа быць схільны называць такія групоўкі "малекулы", але звычайна яе завуць таксама атама.

У больш старых Unix-арыентаваных інструментаў, такіх як grep, подвыражения павінны быць згрупаваны з пазбег дужках, напрыклад, /\(Mary\)/. У Perl і самых апошніх інструментаў (у тым ліку egrep), групоўка робіцца з голымі дужках, але якія адпавядаюць літаральным дужках патрабуе пазбегнуць яго ў шаблён (напрыклад у бок варта Perl).

Класы сімвалаў


/ [Я] /

Мэры га D мала MB-ла.
І ўсюды т т/га Марыі
пайшоў, мб ва-ла ўпэўненая,
ісці.

    

Замест таго, каб назваць толькі аднаго знака, вы можаце ўключыць шаблён у рэгулярнае выраз, якое адпавядае любому з набору знакаў.

Набор сімвалаў можа быць зададзены ў выглядзе простага спісу ў квадратных дужках, напрыклад, /[aeiou]/ будзе адпавядаць якой-небудзь адной галоснай ніжнім рэгістры. Для літару або лічбу дыяпазонаў Вы таксама можаце выкарыстоўваць толькі першае і апошні ліст з дыяпазону, з працяжнік ў сярэдзіне, напрыклад, /[A-Ma-m]/ будзе адпавядаць любы малой ці вялікай ў першай палове алфавіту.

Многія інструменты рэгулярнага выразы таксама забяспечыць выхад стылі цэтлікі для найбольш часта выкарыстоўваюцца класа сімвалаў, такіх як \s для сымбалю і \d для лічбаў. Вы заўсёды можаце вызначыць гэтыя класы сімвалаў ў квадратныя дужкі, але клавішы можна ажыццяўляць рэгулярныя выразы больш кампактным і больш зручным для чытання.

Дадатак аператара


/ [Я ^] /

Ма Ry было трохі бараніны.
І ўсюды, што Ма Ry
пайшоў, ягня быў упэўнены,
ісці.

    

Карэткі сімвал сапраўды можа мець два розных значэння ў рэгулярных выразах. Вялікую частку часу, гэта азначае, у адпаведнасці з нулявой даўжыні ўзору для пачатку лініі. Але калі яна выкарыстоўваецца ў пачатку класа сімвалаў, ён змяняе сэнс знака класа. Усё, што не ўключаны ў пералічаны набор знакаў адпавядае.

Чаргаванне мадэляў


/cat|dog|bird/

The pet store sold cats, dogs, and birds.

/=first|second=/

=first first= # =second second= # =first= # =second=

/(=)(first)|(second)(=)/

=first first= # =second second= # =first= # =second=

/=(first|second)=/

=first first= # =second second= # =first= # =second=

Выкарыстаньне класаў персанажаў з'яўляецца спосаб паказаць, што альбо адна, то іншая рэч можа адбыцца ў вызначаным месцы. Але што, калі вы хочаце паказаць, што любы з цэлых два подвыражения адбываюцца ў пазіцыі ў рэгулярным выразе? Для гэтага вам выкарыстоўваць чаргаванне аператара, вертыкальная рыса ("|"). Гэта знак, які таксама выкарыстоўваецца для абазначэння труб у Unix/абалонкі DOS, і часам называецца вертыкальнай рысы.

Вертыкальнай рысы ў рэгулярны выраз паказвае чаргаванне ўсё ў групе складаючы яго. Што гэта азначае, што нават калі Ёсць некалькі груп злева і справа ад вертыкальнай рысы, чаргаванне прагна пытае за ўсё, з абодвух бакоў. Для выбару сферы чаргаванне, вы павінны вызначыць групу, якая ўключае ў сябе мадэлі, якія могуць супадаць. Прыкладзе.

Асноўныя абстрактныя квантор


/@(=+=)*@/

Матч з нулём у сярэдзіне: @ @
Subexpresion адбываецца, але...: @ = + = ABC @
Шмат падзей :=+==+==+==+==+=

Неабходна паўтарыць усю карціну :=+==+=+==+=

    

Адзін з самых магутных і агульныя рэчы, якія вы можаце зрабіць з дапамогай рэгулярных выразаў з'яўляецца паказаць, колькі разоў атама адбываецца ў поўнай рэгулярнае выраз. Часам вы жадаеце паказаць што-то аб з'яўленні аднаго знака, але вельмі часта вы зацікаўлены ў вызначэнні ўзнікнення класавага характару або згрупаваныя выразы.

Існуе толькі адзін квантор уваходзіць у "асноўныя" сінтаксіс рэгулярных выразаў, зорачка ("*"); на англійскай мове гэта азначае "некаторыя ці нічога" ці "нуль або больш." Калі вы хочаце, каб паказаць, што любую колькасць атамаў можа адбывацца як частка шаблону, выканайце атама зорачкай.

Без кванторов, групоўка выразы на самай справе не служыць шмат мэтаў, але як толькі мы можам дадаць да квантор подвыражения мы можам што-небудзь сказаць аб узнікненні подвыражения ў цэлым. Паглядзіце на прыклад.

Адпаведныя шаблоны ў тэксце: сярэдні


Больш за абстрактныя кванторов


/A+B*C?D/

AAAD
ABBBBCD
BBBCD
ABCCD
AAABBBC

    

У некаторым родзе, адсутнасць якой-небудзь сімвал квантора пасля атама колькасна атама роўна: ён кажа атама адбываецца толькі адзін раз. Пашыраныя рэгулярныя выразы (якія большасць інструментаў падтрымкі) дадаць некаторыя іншыя карысныя нумары на "адзін раз дакладна" і "нуль або больш раз." Са знакам плюс ("+") азначае "адзін або некалькі разоў" і знак пытання ("?") азначае "нуль або адзін раз." Гэтыя кванторы на сённяшні дзень найбольш распаўсюджанымі пералічэнняў Вы завяршаеце наймення.

Калі вы думаеце пра гэта, вы можаце бачыць, што пашыраныя рэгулярныя выразы на самай справе не дазваляюць "казаць" усе асноўныя з іх гэтага не робяць. Яны проста дазваляюць сказаць, што ў больш кароткія і больш чытэльным чынам. Напрыклад, " (ABC)+ "эквівалентна" (ABC)(ABC)* "і" X(ABC)?Y "" эквівалентна XABCY|XY ". Калі атамы колькасна самі з'яўляюцца складанымі згрупаваныя подвыражения, пытальнік і знак плюс можа зрабіць рэчы нашмат карацей.

Лікавай кванторов


/a{5} b{,6} c{4,8}/

aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc

/a+ b{3,} c?/

aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc

/a{5} b{6,} c{4,8}/

aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc

    

Выкарыстаньне пашыраных рэгулярных выразаў, можна паказаць адвольнае ўваходжанне карціна лічыцца выкарыстанне больш шматслоўныя сінтаксіс, чым пытальным знакам, са знакам плюс, а зорачка кванторов. Кучаравы фігурныя дужкі ("{" і "}") могуць акружыць дакладны падлік колькасці ўваходжання вы шукаеце.

Найбольш агульны выгляд фігурнымі колькаснага выкарыстоўвае два дыяпазону аргументаў (спачатку павінны быць не больш, чым другі, і абодва павінны быць неадмоўных цэлымі лікамі). З'яўленне ўказанні колькаснага такім чынам, каб знаходзіцца ў межах мінімальных і максімальных паказаў (уключна). Як скарачэнне, альбо з аргументаў можа быць пустым: калі так мінімум/максімум вызначаны як нулявой/бясконцасці, адпаведна. Калі толькі адзін аргумент выкарыстоўваецца (без коскі там), менавіта гэты лік ўваходжання супадаюць.

Зваротныя спасылкі


/(abc|xyz) \1/

jkl abc xyz
jkl xyz abc
jkl abc abc
jkl xyz xyz

/(abc|xyz) (abc|xyz)/

jkl abc xyz
jkl xyz abc

jkl abc abc
jkl xyz xyz

    

Адзін магутны інструмент у стварэнні шаблонаў пошуку з'яўляецца указаннем, што подвыражения, што быў ўзгоднены раней у рэгулярны выраз падабранае пазней у выразе. Мы робім гэта з дапамогай зваротных спасылак. Зваротныя спасылкі названыя лічбы ад 1 да 9, папярэднічае зваротная касая рыса/бегчы характару пры выкарыстанні ў гэтай манеры. Гэтыя зваротныя спасылкі ставяцца да кожнай наступнай групе ў матчы карціны, як і ў /(one)(two)(three)/\1\2\3/. Кожны нумар зваротная спасылка адносіцца да групы, што ў гэтым прыкладзе, мае слова, адпаведнае лік.

Важна адзначыць, што-то прыкладзе. Што атрымлівае суправаджаецца зваротнай спасылкі такое ж, знакавая радок адпавядае першы раз, нават калі з адпаведных шаблонаў радок магла б адпавядаць іншыя радкі. Проста паўтараць жа згрупаваныя подвыражения ў канцы рэгулярнага выразы не адпавядае той жа мэты, як выкарыстанне зваротнай спасылкі (але вы павінны вырашыць, што гэта вы сапраўды хочаце, каб матч у любым выпадку).

Зваротныя спасылкі звярнуцца да б ні адбывалася ў папярэднія згрупаваныя выразы, у тым парадку, гэтыя згрупаваныя выразы адбылося. З-за наймення (\ 1 -\9), шмат інструментаў абмяжоўвае вас у дзевяць зваротных спасылак. Некаторыя прылады дазваляюць фактычныя назвы зваротных спасылак і/або захавання іх у зменных праграмы. Больш перадавыя часткі гэтага падручніка закрануць гэтыя тэмы

Don't match more than you want to


/th.*s/

-- I want to match the words that start
-- with 'th' and end with 's'.
this
thus
thistle
this line matches too much

    

Кванторами у рэгулярных выразах прагныя. Гэта значыць, яны адпавядаюць столькі, колькі яны магчыма.

Напэўна, самы просты памылкай, каб у складанні рэгулярных выразаў, каб адпавядаць занадта шмат. Пры выкарыстанні кванторов, вы хочаце, каб адпавядаць усе (правы гатункі) да кропкі, дзе вы хочаце, каб скончыць матч. Але пры выкарыстанні "*", "+" ці лічбавай кванторов, лёгка забыць, што апошні біт вы шукаеце можа адбыцца ў канцы лініі, чым той, які вы зацікавіць

Трукі для стрымлівання матчы


/th[^s]*./

-- I want to match the words that start
-- with 'th' and end with 's'.
this
thus
thistle

гэтая лінія адпавядае занадта шмат 

Часта, калі вы выявіце, што вашы рэгулярныя выразы адпаведных занадта шмат, карысныя працэдуры перафармуляваць задачу ў розуме. Замест таго каб думаць пра "тое, што я спрабую, каб адпавядаць пазней у выразе? спытайце сябе: "Што мне трэба, каб пазбегнуць ўзгаднення ў наступнай часткі?" Часта гэта прыводзіць да больш эканомнай ўваходжання шаблону. Часта спосаб пазбегнуць карціна выкарыстоўваць дадатак аператара і характар ??класа. Паглядзіце на прыклад, і думаць аб тым, як яна працуе.

Хітрасць тут у тым, што існуюць два розных спосабу распрацоўкі амаль той жа паслядоўнасці. Вы можаце думаць, вы хочаце захаваць адпаведнасці пакуль не дойдзе да XYZ, або вы можаце думаць, вы хочаце захаваць адпаведнасці, калі вы атрымаеце XYZ. Гэта некалькі адрозніваецца.

Для людзей, якія думалі аб асноўных верагоднасці, той жа схеме адбываецца. Шанец рухомага 6 па памерці ў адзін рулон 1/6. Якая верагоднасць рухомага 6 у шасці рулонаў? Наіўны разлік ставіць шанцы на 1/6 +1/6 +1/6 +1/6 +1/6 +1/6, або 100%. Гэта няправільна, вядома (у канцы канцоў, шанец пасля дванаццаці рулонах не 200%). Правільны разлік "Як пазбегнуць пракаткі 6 у працягу шасці рулонаў?" - Т. е. 5/6 * 5/6 * 5/6 * 5/6 * 5/6 * 5/6, або каля 33%. Шанец атрымаць 6 з'яўляецца такой жа шанец, як не пазбегнуць яго (або каля 66%). На самай справе, калі ўявіць расшыфроўкі серыі косткі рулонах, вы можаце ўжываць рэгулярныя выразы для пісьмовага паведамлення, і аналагічныя мыслення ставіцца.

Камэнтары аб унясенні змяненняў інструменты

Не ўсе інструменты, якія выкарыстоўваюць рэгулярныя выразы дазваляюць змяняць мэтавых радкоў. Некаторыя проста знайсці адпаведнасць шаблоне; асноўным шырока выкарыстоўваюцца рэгулярныя выразы інструмент, верагодна, grep, які з'яўляецца інструментам для пошуку толькі. Тэкставыя рэдактары, напрыклад, можа ці не можа дазволіць замены ў іх рэгулярных сродак пошуку выразы. Як заўсёды, звярніцеся да дакументацыі на ваш індывідуальны інструмент.

З інструментаў, якія дазваляюць вам змяняць тэкст перакладу, Ёсць некаторыя адрозненні, каб трымаць у розуме. Тое, як вы на самай справе паказаць замен будзе вар'іравацца паміж інструментаў: тэкставы рэдактар, магчыма, дыялогавае акно, інструменты каманднага радка будзе выкарыстоўваць падзельнікі паміж матч і замены, мовы праграмавання, як правіла, выклікаць функцыі з аргументамі на матч і замены мадэляў.

Яшчэ адно важнае адрозненне, каб мець на ўвазе, што становіцца змяненне. Unix-арыентаваных інструментаў каманднага радка звычайна выкарыстоўваюць трубы і STDOUT аб унясенні змяненняў у буферы, а не змяняць файлы на месцы. Выкарыстаньне sed каманды, напрыклад, буду пісаць мадыфікацыі кансолі, але не будзе змяняць зыходны файл мэты. Тэкставыя рэдактары ці моў праграмавання, больш верагодна, на самай справе змяніць файл на месцы.

Звярніце ўвагу на змяненне прыклады

Для мэт гэтага кіраўніцтва, прыклады будуць працягваць выкарыстоўваць sed падзельнікаў касая рыса стылю. У прыватнасці, прыклады паказваюць, падстаноўкі каманд і глабальны мадыфікатар, як з " s/this/that/g ". Гэта выраз азначае: "Замяніць" гэта "радок са радком", што "ўсюды ў тэкст перакладу.

Прыклады будзе складацца з мадыфікацыі каманды, радкі ўводу, і лінейны выхад. Лінейны выхад будзе мець ніякіх зменаў падкрэсліў. Акрамя таго, кожны ўваход/выхад лініі будзе папярэднічаць менш чым ці сімвал "больш", каб дапамагчы адрозніць іх (заказ будзе, як апісана таксама), што наводзіць на думку аб перанакіраванні знакаў у абалонках Unix.

Напрыклад літаральным радкі мадыфікацыі


S/кот/сабака/г

<Заапарка былі дзікія сабакі, рысі, львы і іншыя дзікія коткі.
> Заапарка былі дзікія сабакі, сабакі з Бобам, львы і іншыя дзікія сабакі s.
    

Давайце паглядзім на пару прыкладаў мадыфікацыі, якія грунтуюцца на тое, што мы ўжо прайшлі. Гэты проста замяняе некаторыя даслоўны тэкст для некаторых іншых даслоўны тэкст. Пошук і замену магчымасць з многіх інструментаў, можна зрабіць шмат, нават без выкарыстання рэгулярных выразаў.

Напрыклад карціна матчу мадыфікацыі


S/Коткі | сабака/змяя/г

<Заапарка былі дзікія сабакі, рысі, львы і іншыя дзікія коткі.

> Заапарка былі дзікія змеі S, Боб змяя S, львоў і іншых дзікіх змей s.

S/[AZ] + Я [AZ] */добра/г

<Заапарка былі дзікія сабакі, рысі, львы і іншыя дзікія коткі.
> Заапарка былі добрыя сабакі, рысі, прыгожы, і іншыя прыемныя котак.
    

Вялікую частку часу, калі вы выкарыстоўваеце рэгулярныя выразы, каб змяніць тэкст перакладу, вы хочаце, каб адпавядаць больш агульныя заканамернасці, чым проста тэкставыя радкі. Усё, што адпавядае тое, што атрымлівае замяніць (нават калі гэта некалькі радкоў у мэта)

Мадыфікацыя выкарыстаннем зваротных спасылак


S/([Я]) ([0-9] {2,4})/\ 2:\1/г

<A37 B4 C107 D54112 E1103 XXX

> 37: B4 107: З D54112 1103: E XXX
    

Гэта прыемна мець магчымасць уставіць фіксаванай радкі ўсюды карціны адбываецца ў тэкст перакладу. Але, шчыра кажучы, рабіць гэта не вельмі залежыць ад кантэксту. Шмат разоў, мы не хочам толькі, каб ўставіць фіксаваныя радкі, а хутчэй, каб ўставіць тое, што нясе значна больш сувязі з адпаведнасцю мадэлі. На шчасце, зваротныя спасылкі прыходзяць да нас на дапамогу тут. Вы можаце выкарыстоўваць зваротныя спасылкі ў шаблёне-матчы сябе, але гэта яшчэ больш карысна мець магчымасць выкарыстоўваць іх у шаблонах замены. З дапамогай замены зваротныя спасылкі, вы можаце абраць з падыходнай мадэлі для выкарыстання толькі часткі вы зацікавіць

Для палягчэння чытаема, подвыражения будуць згрупаваны з голымі дужкі (як і Perl), а не бег дужках (як з sed ).

Іншае папярэджаньне ад разузгадненне

Гэты ўрок ўжо папярэдзіў аб небяспецы адпаведныя занадта шмат з шаблонаў рэгулярных выразаў. Але небяспека настолькі больш сур'ёзным, калі вы робіце змены, што гэта варта паўтарыць. Калі вы заменіце шаблон, які адпавядае большай радкі, чым Вы думалі пра тое, калі Вы напісалі карціну, у вас ёсць патэнцыйна выдаленыя некаторыя важныя дадзеныя ад вашай мэты.

Гэта заўсёды добрая ідэя, каб выпрабаваць вашыя рэгулярныя выразы па розных дадзеных мэта, якая з'яўляецца прадстаўніком Вашай прадукцыі выкарыстанне. Пераканайцеся, што вы адпаведнасці, што вы думаеце, што вы адпаведнасці. Бадзяжных квантора або шаблён можна зрабіць дзіўна вялікая разнастайнасць тэкстаў адпавядае таму, што вы думалі, быў пэўным шаблоне. Часам вы проста павінны глядзець на вашу карціну на некаторы час, або знайсці іншы набор вочы, каб высветліць, што адбываецца на самай справе нават пасля таго, вы бачыце, што супадзеньняў. Знаёмства можа пароды пагарда, але і прышчапляе кампетэнцыі.

Пашыраны рэгулярных пашырэннях Выраз


Аб дадатковых магчымасцях

Некаторыя вельмі карысныя ўдасканалення, уключаныя ў некаторыя рэгулярныя выразы інструментаў. Гэтыя удасканалення часта робяць складу і падтрымання рэгулярнага выразы значна прасцей. Але праверыць з вашым уласным інструментам, каб убачыць тое, што падтрымліваецца.

Мова праграмавання Perl, верагодна, найбольш складаны інструмент для апрацоўкі рэгулярных выразаў, якое шмат у чым тлумачыць яе папулярнасць. Прыклады праілюстраваны будзе выкарыстоўваць Perl-иш код для тлумачэння паняццяў. Іншыя мовы праграмавання, асабліва для іншых моў сцэнарыяў, такіх як Python, маюць аналагічны спектр аксэсуараў. Але ў мэтах ілюстрацыі, па сінтаксісу Perl найбольш блізка адлюстроўвае рэгулярны выраз інструменты Ён будуецца на такіх, як ed, ex, grep, sed, ??і awk.

Не прагны кванторов


/ М.* S /

- Я хачу, каб адпавядаць словы, якія S торт
- Го "Wi-м і заканчваецца 'S'.
гэтая лінія адпавядае права Jus T

Такім чынам гэтая # # гэтая TLE

/ М.*? S /

- Я хачу, каб адпавядаць слоў, якія пачынаюцца
- З 'й' і сканчацца 'S'.
Такім чынам гэтая # # гэтая TLE

гэтая лінія адпавядае правай

/ М.*? S /

- Я хачу, каб адпавядаць слоў, якія пачынаюцца
- З 'й' і сканчацца 'S'. (Наконец!)
Такім чынам гэтая # # чартапалох
гэтая лінія адпавядае правай
    

Раней у падручніку, праблемы ўзгаднення занадта шмат абмяркоўваліся, і некаторыя абыходныя шляху былі прапанаваны. Некаторыя прылады рэгулярнага выразы дастаткова добры, каб зрабіць гэта лягчэй, забяспечваючы дадатковы не прагны кванторов. Гэтыя квантор захапіць як мага менш у той жа час адпаведнасць усё, што прыходзіць у наступны шаблён (замест як мага больш).

Не прагны кванторы маюць той жа сінтаксіс рэгулярных прагныя з іх, акрамя як з квантором варта знак пытання. Напрыклад, не прагны карціна можа выглядаць наступным чынам: " /A[AZ]*?B/ ". У ангельскай мове гэта азначае "матч, а затым роўна столькі літар, якія неабходныя, каб знайсці B."

Адна маленькая рэч, каб паглядзець за тое, што карціна " /[AZ]*?./ "заўсёды будзе адпавядаць нулю літары. Калі вы выкарыстоўваеце не прагны кванторов, сачыць за адпаведнасць занадта мала, што сіметрычныя небяспекі.

План-матч мадыфікатары


/ М. * [Іна] /

Мэйн # # Масачусэтс Каларада #
Місісіпі Місуры # # # Мінэсота

/ М. * [Іна]/я

Мэйн # # Масачусэтс Каларада #
Місісіпі Місуры # # # Мінэсота

/ М. * [Іна]/ГВС

Мэйн # # Масачусэтс Каларада # # Місісіпі Місуры № Мінэсота # 

Мы ўжо бачылі адзін шаблон-матч мадыфікатара ў мадыфікацыі прыклады: г ЛОБАЛЬНЫЕ мадыфікатара. У самой справе, у многіх рэгулярных інструменты выразы, мы павінны былі выкарыстаць "г" мадыфікатар для ўсіх нашых шаблону. Без "г", шмат інструментаў будзе адпавядаць толькі першае ўваходжанне ўзор на лініі ў мэта. Так што гэта карысна мадыфікатара (але не той, які вы абавязкова жадаеце выкарыстоўваць заўсёды). Давайце паглядзім на некаторыя іншыя.

Як мала мнеманічна, прыемна ўспомніць слова "Gismo" (нават здаецца, як-то неабходнасці). Найбольш частымі мадыфікатары:

  • G - Матч глабальна
  • Я - Без уліку рэгістра матч
  • S - Лячыць радок у якасці адной лініі
  • м - Лячыць радок, як некалькі радкоў
  • O - Толькі кампіляцыі шаблон раз

O опцыя ажыццяўлення аптымізацыі, а на самой справе не чарговы выпуск выраз (але гэта дапамагае мнеманічна). Ингл-радка S дазваляе шаблон, каб адпавядаць новай радкі (ён будзе не інакш). Ultiple-м радка прычын "^" і "$", каб адпавядаць пачатку і заканчэння кожнай радкі ў мэтавы, а не толькі пачатак/канец мэты ў цэлым (з sed або grep гэта па змаўчанні). Я nsensitive параметр ігнаруе адрозненні паміж рэгістр літар.

Змяненне паводзінаў зваротнай спасылкі


S/([AZ ])(?:-[ AZ] {3 }-)([ 0-9] *)/\ 1\2/г

<-XYZ-37 # B: ABCD: 142 # C-WXY-66 # D-QRS-93
> A37 # B: ABCD: 42 # # C66 D93

    

Backreferencing у шаблонах замены з'яўляецца вельмі магутным, але гэта таксама просты ў выкарыстанні больш дзевяці груп у складанае рэгулярнае выраз. Цалкам незалежна ад выкарыстання да даступных імёнаў зваротнай спасылкі, часта больш пераборлівым для абазначэння часткі замены шаблону ў паслядоўным парадку. Каб справіцца з гэтым пытаннем, некаторыя рэгулярныя выразы прылады дазваляюць "групоўкі без backreferencing".

Групы, якія не павінны таксама разглядацца як зваротная спасылка мае пытальнік двукроп'я ў пачатку групы, як і ў " (?:pattern). " На самай справе, вы можаце выкарыстоўваць гэты сінтаксіс, нават калі вашыя зваротныя спасылкі ў шаблён пошуку сябе.

Найменне зваротныя

 
імпарту паўторна
TXT = "-XYZ-37 # B: ABCD: 142 # C-WXY-66 # D-QRS-93"
re.sub друку ("(? Р <prefix> [AZ ])(-[ AZ] {3 }-)(? P <id> [0-9 ]*)",
             "\ Г <prefix>\г <id>", TXT)

A37 # B: ABCD: 42 # # C66 D93

    

Мова Python прапануе асабліва зручна сінтаксіс сапраўды складаны зваротныя карціны. Замест таго каб проста гуляць з нумарацыя адпавядае груп, вы можаце даць ім назву.

Сінтаксіс з выкарыстаннем рэгулярных выразаў у Python з'яўляецца стандартнай функцыяй мовы праграмавання/метад стыль размовы, а не Perl-або sed -стыль падзельнікаў касую рысу. Калі ласка, праверце свой уласны інструмент, каб убачыць, калі ён падтрымлівае гэты аб'ект.

Сцвярджэнні датычна наступнага тэксту


S/([AZ ]-)(?=[ AZ] {3}) ([A-Z0-9] *)/\ 2\1/г

<-Xyz37 # B-ab6142 # С-Wxy66 # D-qrs93
> Xyz37A-# B-ab6142 # С-Wxy66 # qrs93D-

S/([AZ ]-)(?![ AZ] {3}) ([A-Z0-9] *)/\ 2\1/г

<-Xyz37 # B-ab6142 # С-Wxy66 # D-qrs93
>-Xyz37 # ab6142B-# # Wxy66C-D-qrs93


Яшчэ адна выкрут перадавых інструментаў рэгулярнага выразы "Сцвярджэнні датычна наступнага тэксту." Яны падобныя на звычайныя згрупаваныя подвыражения, калі не на самай справе не схапіць тое, што яны супадаюць. Ёсць два перавагі выкарыстання Сцвярджэнні датычна наступнага тэксту. З аднаго боку, перадпрагляд сцвярджэнне можа функцыянаваць такім жа чынам, каб групу, якая не backreferenced, гэта значыць, вы можаце супаставіць што-то, не лічачы, у зваротных спасылак. Аднак больш важна тое, перадпрагляд сцвярджэнне можна паказаць, што наступны кавалак карціна мае пэўную форму, але хай розных подвыражения фактычна захапіць яго (як правіла, для мэт backreferencing, што іншыя выразы.

Ёсць два віды прагляду наперад сцвярджэнні: станоўчыя і адмоўныя. Як і варта было чакаць, станоўчыя зацвярджэння паказвае, што нешта прыйдзе наступны, і адмоўны паказвае, што нешта не далей. Падкрэсліваючы іх сувязь з няўрадавымі арганізацыямі, backreferenced груп, сінтаксіс для прагляду наперад сцвярджэнні аб тым жа: (?=pattern) для станоўчых сцвярджэнняў, і (?!pattern) для адмоўных сцвярджэнняў.

Стварэнне рэгулярных выразаў больш чытэльным

У наступных прыкладах мы пачалі бачыць, наколькі складаныя рэгулярныя выразы можна атрымаць. Гэтыя прыклады не палову. Гэта можна зрабіць некаторыя амаль абсурдна цяжкім для разумення рэчы з рэгулярным выразам (але тыя, якія, тым не менш карысна).

Існуюць два асноўных аб'ектаў, што некаторыя з больш прасунутых інструментаў рэгулярнага выразы выкарыстоўваць у высвятленне выразаў. Адзін з іх дазваляе рэгулярныя выразы, каб працягвацца на працягу некалькіх ліній (ігнаруючы прабелы як прабелы і радкі). Другая дазваляе каментары ўнутры рэгулярных выразаў. Некаторыя прылады дазваляюць рабіць той ці іншы з гэтых рэчаў у адзіночку, але калі гэта становіцца складанай, то і іншае!

Прыведзены прыклад выкарыстоўвае па электроннай Perl х правіла мадыфікатар каб пракаментаваў некалькі радкоў рэгулярных выразаў. Звярніцеся да дакументацыі на свой уласны інструмент для падрабязнасьцяў аб тым, як пісаць гэтыя.


/               # identify URLs within a text file
          [^="] # do not match URLs in IMG tags like:
                # <img src="http://mysite.com/mypic.png">

http|ftp|gopher # make sure we find a resource type
          :\/\/ #...needs to be followed by colon-slash-slash
      [^ \n\r]+ # stuff other than space, newline, tab is in URL
    (?=[\s\.,]) # assert: followed by whitespace/period/comma
/

URL-адрас для майго сайта: http://mysite.com/mydoc.html. 
Вы можаце таксама атрымліваць асалоду ад 
ftp://yoursite.com/index.html за добрае месца для загрузкі файлаў. 
Popular Links
Published (Last edited): Apr 7 , source: http://gnosis.cx/publish/programming/regular_expressions.html