[Powered by Google Translate] [Семинар: модел за појавување со регуларни изрази] [Џон Mussman-Универзитетот Харвард] [Ова е CS50.-CS50.TV] Во ред. Па, добредојде секого. Ова е CS50 2012 година. Моето име е Јован, и јас ќе се зборува денес за регуларни изрази. Регуларни изрази првенствено е алатка, но, исто така, понекогаш се користи во кодот активно да суштина одговараат на обрасци и жици. Па тука е веб-стрип од xkcd. Во овој стрип постои убиство мистерија каде убиец има проследено некој на одмор, а протагонистите треба да пребарувате низ 200 мегабајти на пораки потрага за адреса. И тие се за да се откажат кога некој кој знае регуларни изрази - веројатно суперхерој - swoops долу и да пишува некои код и решава убиство мистерија. Па веројатно тоа ќе биде нешто што ќе бидат овластени да го стори по овој семинар. Ние сме само ќе обезбеди концизен вовед во јазикот и да ви даде доволно средства да одат по повеќе ресурси за своја. Така регуларни изрази се погледне во основа како ова. Ова е регуларниот израз во Ruby. Тоа не е страшно различни низ јазици. Имаме само на засеци да започне и марка на регуларниот израз во Ruby. И ова е регуларен израз да се погледне за во е-мејл адреса шема. Така можеме да видиме на првиот бит изгледа за било алфанумерички карактер. Тоа е затоа што е-мејл адреси често мора да започне со азбучен карактер. А потоа некои посебни карактер следи од страна на @ симбол. А потоа истото за име на домен. А потоа, помеѓу 2 и 4 карактери да се погледне за. Com,. Нет, и така натаму. Па тоа е уште еден пример на регуларниот израз. Така регуларни изрази се протоколи за изнаоѓање модели во текстот. Тие го прават споредби, селекции, и замени. Па Трет пример е наоѓање на сите телефонски броеви завршуваат со 54 во директориумот. Па пред Дејвид симнува до CS50 директориум би можеле да бараме некој модел каде што имаме голема заграда потоа 3 броја потоа завршуваат заграда, 3 повеќе броеви, цртичка, 2 броја, а потоа 54. И дека ќе биде во суштина тоа како ние се излезе со регуларен израз за пребарување за тоа. Па така постојат - ние сме го направиле некои работи во CS50 кои се малку како регуларни изрази, па - на пример - во dictionary.C датотека за проверка на правопис проблем сет може да се користат fscanf да се прочита во еден збор од речникот. И можете да го видите процентот 45S е во потрага по низа од 45 карактери. Па тоа е нешто како рудиментирана регуларниот израз. И можете да имате било какви 45 карактери кои се вклопуваат во законот во таму и да го изберат оние до. А потоа вториот пример во најновата веб програмирање проблем поставени во distro код за php ние всушност го имаат едноставни регуларниот израз. И овој е само едноставно бараат да се провери ако на веб-страница, која е донесен во одговара или пријавете се или одјава се регистрирате. PHP. А потоа се враќа точно или неточно врз основа на таа регуларниот израз појавување. Па кога го користите регуларниот израз? Зошто сте овде денес? Значи, вие не сакате да го користите на регуларниот израз кога има нешто што не на работа за вас, дури полесно. Па XML и HTML се всушност доста слабо да се напише регуларни изрази за како што ќе видиме во малку. Па така постојат посветен парсери за оние јазици. Исто така треба да биде во ред со трговија добиени и точност често. Ако се обидувате - па видовме регуларниот израз за е-мејл адреса, но велат дека си сакал одредена е-мејл адреса и постепено на регуларниот израз може да стане уште посложен како што стана попрецизна. Така што ќе биде една пласирам. Мора да бидете сигурни дека се е во ред со правење на регуларниот израз. Ако знаеш точно она што го барате за тоа може да го направи повеќе смисла да се стави во време и да напише повеќе ефективни парсерот. И конечно, тука е историски проблем со регуларноста на изрази и јазици. Регуларни изрази се всушност многу помоќен од регуларни изрази за да се каже во формална смисла. Па јас не сакаат да одат премногу далеку во формалниот теорија, но повеќето јазици кои ние код во всушност не се редовни. И ова е причината зошто регуларни изрази понекогаш не се сметаат сите дека сигурно. Значи, во основа постои хиерархија Чомски за јазици, и регуларни изрази се изгради со помош унија, конкатенација, и ѕвездата Kleene операција која што ќе видиме во неколку минути. Ако сте заинтересирани во теорија има доста случува таму под хауба. Толку кратка историја - само за контекстот тука - редовно поставува дојде во 1950 година, а потоа моравме едноставна уредници кои инкорпорирани регуларни изрази - само потрага по жиците. Grep - кој е алатка со командна линија - беше еден од првите многу популарна алатки кои ставена регуларни изрази во 1960-тите. Во 80-те, perl бил изграден - е програмски јазик кој вклучува регуларни изрази многу видливо. А потоа од неодамна имавме Perl компатибилна регуларни изрази протоколи основа на други јазици кои ги користат многу од истата синтакса. Се разбира најважниот настан беше во 2008 година каде што имаше првиот Национален регуларни изрази за ден, што верувам дека е 1 јуни, ако сакате да го слават тој. Повторно, само малку повеќе теоријата тука. Па така постојат неколку различни начини на градење на регуларни изрази. Еден едноставен начин е да се изгради израз кој ви се случува да работат на стрингот протолкува - во основа се изгради малку мини-програма која ќе ги анализира парчиња низа и да видиме, "Ох, дали тоа одговара на регуларен израз или не?" И потоа изврши тоа. Значи, ако имате многу мал регуларен израз, ова е веројатно на најефикасен начин да го направи тоа. А потоа, ако вас - уште една опција е да се задржи реконструкција на израз како да одиш, а тоа е можноста симулираат. И овие рани обиди на регуларниот израз алгоритми се релативно едноставен и релативно брза, но не треба многу флексибилност. Па да се направи дури и некои од работите кои ние ќе се обидеме да се погледне во денес ние требаше да се направат повеќе сложени регуларниот израз имплементации кои се потенцијално многу побавен, па тоа е нешто да се има предвид Исто така има и регуларни изрази негирање на нападот различни кои ги искористат потенцијалот за овие поновите имплементации на регуларни изрази за да стане многу сложен. И во ист смисла што сме го виделе во buffer overflow напади, имате напади кои работат со тоа што рекурзивен јамки кои лизгањето на капацитетот на меморијата. И патем Regexen е еден од официјалните множествени на регуларниот израз по аналогија на воловите во англо-саксонските. Океј, па библиотека Пајтон многумина од вас овде во лице имаат Macs, така што всушност може да се повлече оваа појавува на вашиот екран. Регуларни изрази се вградени во Python. И така Пајтон е во пакет на Macs и, исто така, се достапни онлајн на овој линк. Значи, ако се гледа можете да го паузирате и бидете сигурни дека имате Пајтон како што се позанимавам тука. Постои рачен интернет, па ако само тип Пајтон во вашиот компјутер ќе видите дека верзијата доаѓа во терминал. Па јас обезбедени линк до прирачник за Верзија 2 на Python како и измамник лист. Постои Верзијата број 3 на Python, но вашиот Mac не мора да доаѓаат со тоа во пакет. Па не е страшно поинаква. Океј, па некои основите на користење на регуларни изрази во Python. Па еве јас се користи многу едноставен израз, па јас не Пајтон увоз повторно и потоа зеде резултат на re.search. И потрагата зема 2 аргументи. Првиот е регуларен израз, а вториот е текстот или низа сакате да се анализира. А потоа јас отпечатени на result.group. Значи овие се 2 основни функции ние ќе се обидеме да го видат денес за учење за регуларни изрази. Па само рушење на оваа регуларниот израз овде ж а потоа \ W и тогаш сум толку \ w само прифаќа било азбучен лик во таму. Па еве ние сме во потрага за една "ж", а потоа друг азбучен карактер а потоа метри, па еве што ќе одговараат на шунка во ", Абрахам Линколн и шунка сендвичи." Ова е резултат на таа група. Друга работа што можеме да направиме е ги користат нашите пред низи на текст во Python. Па претпоставувам дека ќе оди напред и да се повлече дека тука горе. Пајтон увоз повторно. И ако јас требаше да го прават истото - да речеме текст е, "Авраам", нека зумирате - таму ќе одиме. Текстот е "Авраам јаде шунка." Во ред, а потоа резултира = re.search. А потоа нашите израз може да биде h, а потоа јас ќе направам точка м. Па дот само ги зема било карактер што не е нова линија вклучувајќи броеви, процент знаци, такво нешто. А потоа текст - бум - и потоа result.group--Да. Па тоа е само како да се имплементира основната функционалност тука. Ако имавме текст прстен што - тоа лудо текст - вклучени се каже многу назад засеци и жици внатре и работи кои би можеле да изгледаат избега секвенци, тогаш ние веројатно сакаат да го користат суровини внесување на текст за да бидете сигурни дека е прифатена. И тоа само изгледа така. Значи, ако бевме во потрага за секој од нив таму ние не треба да најдам ништо. Но тоа е како ќе се имплементира, само пред низа од на регуларниот израз ќе се стави на буквата Р. Океј, па нека продолжувам да одам. Сите права - па нека се погледне на неколку повторливи модели тука. Значи едно нешто што сакате да направите е да се повторува работите како што се бараат преку текст. Па да се направи проследено со кој било број на б - правиш AB *. А потоа таму се и низа други правила исто така. И може да се погледне на сите овие горе, јас само ќе поминува низ некои од најчесто се користат оние. Па AB + е проследено со било N поголема од 0 на b. зло? е проследено со 0 или 1 од б. AB {n} е проследено со N на б, а потоа и така натаму. Ако имате 2 броеви во големите загради се одредување на опсег кои можат да бидат евентуално исти. Па ние ќе го разгледаме повеќе на неколку повторливи обрасци во една минута. Па 2 работи да се има предвид при користење на овие модел за појавување алатки тука. Така велат сакаме да се погледне на hm на "Абрахам Линколн прави шунка сендвичи." Па јас го промени името Абрахам Линколн на Авраам. И сега сме во потрага за она што се вратија од ова пребарување функција, и тоа само се враќа шунка во овој случај. И тоа го прави тоа, бидејќи за пребарување едноставно природно се зема левата повеќето задача. И сите регуларни изрази, освен ако не се определи поинаку ќе го правам тоа. Ако сакавме да ги најдете сите постои функција за тоа - ги најдете сите. Така што може само да погледнете како и сите = re.findall ('h.m ", текст) а потоа all.group (). Сите произведува двете шунка и сланина, во овој случај и двете на жиците во Авраам секоја шунка. Па тоа е уште една опција. Одлично. Од друга работа да се има предвид е дека регуларни изрази се најголемите интуитивно. Дозволете ни да се погледне на овој пример. Ние го сторивме дека левата повеќето интернет тука, а потоа јас се обидел поголем пребарување користење на Kleene ѕвезда оператор. Значи за "Абрахам Линколн прави шунка сендвичи," а јас само се вративте м, како резултат. Причината за таа грешка беше тоа што јас би можел да земе било кој број на ж е затоа што јас не прецизираше ништо да патувам во меѓу ч и м. Само пример таму што имаше м - единствениот примери има со m во неа и било кој број на час беа само низа м. Тогаш јас се обидов повторно, реков, "Океј, ајде да го добиете вистинскиот најголемата група тука." И потоа направив часот. * М, така што само се враќа било кој број на карактери помеѓу ч и м. И ако сте само почетна надвор и размислување, "О, добро, добро ова ќе ме сфаќајте шунка ", што всушност е потребно сè, од час во Абрахам Линколн сите на патот до крајот на шунка. Тоа е алчен, тоа го гледа ж - сето тоа друг текст - м, и тоа е она што е потребно внатре Ова е особено острата - ова е карактеристика ние исто така може се определи за не би било алчен со употреба на други функции. Но, ова е нешто што треба да имајте на ум, особено кога гледа во HTML текстот, што е една од причините што регуларни изрази се тешки за HTML. Затоа што ако имате HTML отворен таг и тогаш многу нешта во средината а потоа некои други HTML затворени таг многу подоцна во програмата, имате само јаде многу од вашето HTML кодот најверојатно по грешка. Сите право - така повеќе специјални карактери, како и многу други јазици, ние да избега со помош на коса црта. Значи можеме да го користиме точка да специфицирате било карактер, освен за нова линија. Можеме да го користиме бегство w да специфицирате било азбучен карактер. И по аналогија бегство г за секој цел број - нумеричка карактер. Може да се определи - можеме да го користиме загради да одредите поврзани со изрази. Така што ова ќе го прифати, Б, или Ц. И ние исто така може да се определи или опции за или или b. На пример - ако бевме во потрага по повеќе можности во загради можеме да го користите или операторот, како и во - па нека се врати во овој пример тука. И сега нека се - да се вратиме на овој пример тука, а потоа земе Ae - па ова треба да се врати - Претпоставувам ова е уште Авраам. Значи ова - ако тоа го правиме сите - одлично. Па нека се ажурира текстот овде. "Авраам јаде шунка додека Hemming неговата -. Додека hemming" Одлично. Сите. Одлично. Сега ќе го добиеме шунка, шунка, и полите. Додека hemming - додека потпевнува со него - додека потпевнува да полите него. Одлично. Истото. Сега сите се враќа уште само шунка, шунка, и полите без подигање на потпевнувам или него. Велики - па што ако сакаме да се погледне во било што - така и ние не можеше да стори него или - ние ќе се вратам на тоа. Океј - така - сите во право - во позиции можете да го користите на коректорски знак или знакот за долар да се каже дека сте во потрага за нешто на почетокот или на крајот на стринг. Или на почетокот или на крајот на зборот. Тоа е еден начин да се користи тоа. Ред - па нека се позанимавам со малку поголем блок од текст. Да речеме овој ред тука - оваа изјава тука. Моќта на регуларен израз е дека тие може да се определи модели не само фиксен карактери. Дозволете ни да го направи - да ни се јавите овој блок. Тогаш ние ќе го читаат сето тоа внатре А потоа да има - нека направи сите =, па она што се некои работи би можеле да бараме тука профитабилно? Ние би можеле да се погледне за изразување уво. Не е многу интересно. Како за тоа? Ќе видиме што се случува. Го дадов проблем. Значи било кој број на нештата пред повторно и сите. Така што треба да се вратат сè, од почетокот до сите ре можеби неколку пати. А потоа тука имаме моќ на регуларни изрази е дека тие може да се определи моделите не само ликови тука се. Така што сите на патот до финалето повторно, таа започна со левата најмногу и беше алчен. Ајде да видиме - што друго би можеле да се погледне за. Претпоставувам дека една работа, ако сте биле заинтересирани во потрага за заменки таа и тој, може да се провери за е еднаква на 0 или 1 и изразувањето тој, и дека е веројатно нема да се вратат - ох, претпоставувам дека тој се вратил затоа што ние сме во потрага на власт, тој ден, тука се. Нека се обидат наведувајќи дека ова мора да дојде во почетокот на нешто. Ајде да видиме ако тоа опаѓа. Така што можеме да направиме масти, и таму ние не добиваме ништо, бидејќи таа и тој не се појавуваат во оваа фраза. Одлично. Ред - па назад на мачката тука. Толку сложени модели е повреда на мозокот. Па тоа е причината зошто ние се користи регуларни изрази за да се избегнат овие проблеми. Значи тука се и некои други корисни начини можете да се позанимавам со. Ние погледна пребарување денес, но исто така можете да го користите натпревар, Сплит, findall, и групи. Па други кул работи што можете да направите со регуларни изрази освен само во потрага по модели изведува шема и одржување на сите натпревари - нејзините променливи - и потоа со употреба на оние во вашиот код подоцна. Кои можат да бидат доста корисни. Други работи може да се смета. Значи ние можеме да сметаме на бројот на случаи на регуларниот израз шема, и тоа е она што можеме да го користиме групи за. И други начини, како и се, исто така, е можно. Па јас само сакам да зборувам малку повеќе за други начини можете да го користите регуларни изрази. Значи уште една напредна апликација е во фази појавување. Значи, ако сте во потрага за еден текст заради изразување, Јулиј Цезар, и ќе видите или Гај Јулиј Цезар или името Јулиј Цезар во други јазици, тогаш можеби ќе сакате да го доделите некоја тежина на тие вредности. И ако тоа е доволно блиску - ако тој преминува одреден праг - тогаш сакате да бидат во можност да ја прифати Јулиј Цезар. Па така постојат неколку различни имплементации за тоа во неколку други јазици, како и. Тука се и некои други алатки, регуларниот израз Пал - корисна малку стан онлајн, за да проверете дали вашиот регуларни изрази се составени правилно. Исто така има и самостојни алатки кои можете да ја стартувате од вашиот десктоп како Ултра Пико, и како и само куварица. Значи, ако се прави проект кој вклучува еден тон на регуларни изрази ова е веројатно место да одат надвор од опсегот на денешницата. А потоа само да ви даде чувство за тоа како заеднички тоа е постои grep во Unix, perl има вграден во, и C постои PCRE за C. А потоа сите овие други јазици, исто така, имаат регуларен израз пакети кои работат со суштина иста синтакса ние се здобија со вкус на денешницата. PHP, Java, Ruby, и така натаму. Код на Google Search е всушност вреди да се спомене, тоа е еден од релативно мал број на апликации таму што му овозможува на јавноста за пристап својата база на податоци со користење на регуларни изрази. Па ако се погледне на Код на Google Барај можете да најдете кодот ако сте во потрага за пример за тоа како еден функција може да се користи, можете да го користите регуларен израз да се најде таа функција се користи во сите видови на различни случаи. Вие би можеле да се погледне за запишување, а потоа можете да барате знамето на пишуваат или читаат ако си сакал пример за запишување кои се користат во тој случај. Па истото таму, и тука се и некои референци. Ова ќе бидат достапни на интернет како и, па оди напред ако сакате да се погледне во Пајтон, grep, perl - вие само сакате да добиете некои инспирација или ако сакате да се погледне повеќе на теорија еве некои добри скокање исклучи места. Ви благодарам многу. [CS50.TV]