[Powered by Google Translate] [Seminar: Daimi ifadələri ilə Eşleme Pattern]
[John Mussman-Harvard Universiteti]
[Bu CS50.-CS50.TV]
OK. Bəli, hər kəs xoş gəlmisiniz. Bu CS50 2012.
My name John və mən normal ifadeler haqqında bu gün söhbət olunacaq.
Daimi ifadələr əsasən vasitədir, həm də bəzən istifadə
kodu fəal əhəmiyyətli nümunələri və strings uyğun.
Belə ki, burada xkcd bir web komik var.
Bu komik ildə qatil olduğu bir qətli sirr var
tatile kimsə təqib və başkahramanlarıdır var
bir ünvan axtarır e-poçt 200 megabayt vasitəsilə axtarış.
Onlar normal ifadeler bilən zaman kimsə imtina haqqında -
ehtimalla bir superhero - swoops aşağı və bəzi kodu yazır
və qətli sirr həll edir.
Belə güman ki, siz bunu etmək səlahiyyətinə malik olacaq ki, bir şey olacaq
Bu seminarda sonra.
Biz yalnız dili qısa giriş təmin edir
və sizin öz daha çox qaynaq sonra getmək üçün kifayət qədər para verir.
>> Belə ki, normal ifadeler bu kimi əsasən baxmaq.
Bu Ruby bir normal ifade edir.
Bu dillər arasında olduqca fərqli deyil.
Biz Ruby normal ifadə başlamaq və işarələmək üçün yalnız slashes var.
Bu e-mail ünvanı model üçün baxmaq üçün müntəzəm ifadəsidir.
Beləliklə, biz birinci bit hər hansı bir alfasayısal karakter axtarır baxın.
E-poçt ünvanlarını tez-tez əlifba xarakteri ilə başlamaq lazımdır görədir.
Və sonra hər hansı bir xüsusi xarakter @ simvolu izlədi.
Və sonra domen adı üçün eyni şey.
Və sonra 2 arasında və 4 simvol s net. Ki,. Com axtarmaq və.
Belə ki, normal ifade digər bir nümunəsidir.
Belə ki, normal ifadeler mətn inciləridir tapmaq üçün protokollar var.
Onlar müqayisə, Marka, və dəyişdirmə edin.
Bir kataloq 54 bitən bütün telefon nömrələrini tapmaq bir üçüncü misal var.
Belə ki, CS50 kataloq yuxarı David rips əvvəl axtarmaq bilər
biz parantez olduğu bir model sonra 3 ədəd, sonra mötərizə son
3 nömrələri, tire, 2 ədəd, sonra 54.
Və biz bu axtarmaq üçün müntəzəm ifadə ilə gəlmək necə əhəmiyyətli olardı.
>> Belə ki, orada var - biz CS50 bəzi işlər var kimi bir az ki,
belə normal ifadeler, - məsələn üçün - dictionary.C faylı
yazım çek problem set üçün təşəkkür fscanf istifadə ola bilər
Lüğətə bir sözlə oxumaq.
Və siz faiz 45s 45 simvol bir simli axtarır bilərsiniz.
Belə ki, elementar normal ifade kimi bir az deyil.
Və orada qanun uyğun hər hansı bir 45 simvol ola bilər
və bu qədər seçin.
Ən son web proqramlaşdırma problem və sonra ikinci misal
PHP üçün distro kodu müəyyən biz, həqiqətən, sadə bir normal ifade var.
Və bu sadəcə internet səhifəsində qəbul edilir ki, əgər yoxlamaq üçün axtarır
ya giriş oyunları və ya qeydiyyatdan logout. PHP.
Və sonra müntəzəm ifadə uyğunluğu əsasında doğru və ya yalan dönür.
>> Belə ki, zaman normal ifade istifadə edirsiniz?
Niyə bu gün burada var?
Ki, bir şey var zaman Belə ki, normal ifade istifadə etmək istəmirəm
daha asan sizin üçün iş görür.
Belə ki, XML və HTML həqiqətən olduqca çətin olur
biz bir az görmək olacaq kimi normal ifadeler yazmaq.
Belə ki, bu dil üçün xüsusi parsers var.
Siz həmçinin tez-tez ticarət off və dəqiqliyi ilə tamam olması lazımdır.
Əgər çalışırıq, əgər - belə ki, e-mail üçün müntəzəm ifadə gördüm
lakin müəyyən bir e-mail istəyirdi və tədricən demək
daha çox dəqiq oldu normal ifade daha kompleks ola bilər.
Belə ki, bir ticarət off olacaq.
Siz tamam normal ifadə edərək əmin olmalıdır.
Əgər Sizin tam olaraq nə o, daha məntiqli ola bilər
vaxt qoymaq və daha səmərəli parser yazmaq.
Və nəhayət qanunauyğunluqları ilə tarixi mövzu var
ifadələr və dil.
Daimi ifadələrin həqiqətən çox daha güclü daha var
hər normal ifadeler formal mənada deyirəm.
>> Belə ki, rəsmi nəzəriyyə daxil çox uzaq getmək istəmirəm
lakin ən languages ​​biz, həqiqətən, kod müntəzəm deyil.
Normal ifadeler bəzən bütün təhlükəsiz hesab niyə Və bu.
Belə ki, əsasən diller üçün Chomsky iyerarxiya var
və normal ifadeler birliyi, concatenation istifadə qurmaq olunur
və biz bir neçə dəqiqə Kleene ulduz əməliyyat görəcəyik.
Əgər istəyirsinizsə nəzəri başlıq altında gedən olduqca çoxdur.
>> Qısa tarixi Belə ki, - burada yalnız kontekstində üçün - daimi dəst gəldi
1950-ci ildə, sonra biz bu sadə redaktorları idi
normal ifadeler daxil - yalnız strings üçün axtarış.
Grep - bir command line vasitədir - ilk biri idi
1960-cı illərdə normal ifadeler daxil çox populyar alətlər.
80-ci illər, Perl tikildi - bir proqramlaşdırma dilidir ki,
çox yer normal ifadeler daxildir.
Və sonra bu yaxınlarda biz Perl uyğun normal ifade var
əsasən eyni sintaksis çox istifadə edən digər dillərdə protokolları.
Əlbəttə, ən mühüm hadisə 2008-ci ildə
olduğu ilk Milli normal ifadeler günü var idi
ki, qeyd etmək istəyirəm əgər mən 1 iyun inanıram.
>> Burada Yenə, yalnız bir az daha nəzəriyyəsi.
Belə ki, normal ifadeler tikintisi bir neçə müxtəlif yolları var.
Bir sadə yol gedir ifadə qurulmasıdır
şərh string run - əsasən ki, mini-proqram bir az qurmaq
simli ədəd təhlil və görəcəksiniz, "Oh, bu normal ifade uyğun və ya deyil?"
Və sonra axır.
Bir çox kiçik normal ifade varsa, bu yəqin ki,
bunu ən səmərəli yolu.
Və sonra əgər - Başqa bir seçim yenidən davam edir
ifadə getmək olduğunu və simülasyonu imkan kimi.
Və normal ifade alqoritmlər bu erkən cəhdlər idi
nisbətən sadə və nisbətən sürətli, lakin rahatlıq çox yox idi.
Belə ki, bəzi şeyləri biz baxmaq edir ki, hətta bunu
Bu gün biz daha mürəkkəb müntəzəm ifadə etmək idi
potensial çox yavaş ki, həyata, ağılda tutmaq üçün bir şey ki,
Hücum müxtəlif bir normal ifadeler inkar da var
bu yeni tətbiq üçün potensial istismar edən
çox mürəkkəb olmaq üçün normal ifadeler.
Və biz Buffer Overflow hücum gördüm ki, çox eyni mənada,
ki, işlər recursive loops edərək hücumlar var
yaddaş tutumu dağıtmaq.
Və yolu ilə Regexen normal ifade rəsmi çoğullarının biridir
Anglo-Sakson ilə öküz analoji olaraq.
>> OK, belə ki, Python Kitabxanası şəxs burada bir çox Macs var,
belə ki, həqiqətən, sizin ekranda bu qədər çəkmək olar.
Normal ifadeler Python daxil inşa edilir.
Və belə Python bu keçid Macs və həmçinin mövcud online önyüklenmesi olunur.
Siz müşahidə olunur Belə ki, əgər fasilə və Python əmin edə bilərsiniz
biz burada ətrafında oynayır.
Yalnız kompüter Python yazın əgər bir dərslik online var
Siz versiyası terminal qədər gəlir ki, görəcəksiniz.
Beləliklə, mən Python Version 2 eləcə də fırıldaqçı hesabatı üçün dərslik bir keçid təmin edir.
Var Python bir Version 3, ancaq Mac Mütləq deyil
önyüklenmesi ilə gəlir.
Belə ki, olduqca fərqli deyil.
OK, belə ki, Python müntəzəm ifadələr istifadə bəzi əsasları.
>> Belə ki, burada bir çox sadə ifadəsi istifadə, belə ki, Python idxal yenidən etdi
və sonra re.search nəticəsində aldı.
Və axtarış 2 dəlilləri edir.
İlk normal ifade və ikinci mətn
və ya analiz etmək istəyirəm string.
Və sonra mən result.group çap.
Belə ki, bu gün biz görmək üçün gedir 2 əsas funksiyaları
normal ifadeler haqqında öyrənmək.
Belə ki, yalnız bu normal ifade burada parçalayaraq
h və sonra \ w və sonra m belə \ w orada heç bir əlifba xarakter qəbul edir.
Belə ki, burada başqa bir əlifba xarakter bir "H" axtarır və sonra
və sonra m, belə ki, burada vetçina uyğun olardı ki,
in, "Abraham Lincoln və vetçina sandviçler."
Bu qrup nəticəsidir.
Biz nə edə bilər ki, başqa bir şey Python mətn bizim əvvəl strings istifadə edir.
Mən irəli getmək və burada qoparmaq edəcək danışarlar.
Python idxal yenidən.
Və mən eyni şey idi əgər -, bizə mətn deyək
"İbrahim," Bizə Yakınlaştırmak edək - oraya gedin.
Mətn "İbrahim vetçina yeyir." Dir
Okay, sonra = re.search nəticəsində.
Və sonra ifadə h ola bilər, və sonra dot m edəcəyik.
Belə dot yalnız nömrələri daxil olmaqla, yeni xətt deyil ki, hər hansı bir xarakter alır
faizlə əlamətləri, belə bir şey.
Və sonra mətn - bumu - və sonra result.group-evet.
Belə ki, burada əsas funksionallığı həyata keçirilməsi üçün yalnız necə.
Ki, crazy mətn - - biz bir metin üzük olsaydı geri slashes çox demək daxil
və daxili strings və escape ardıcıllığı kimi baxmaq bilər ki, hər şeyi,
sonra biz yəqin ki, qəbul əmin etmək üçün xammal mətn daxil istifadə etmək istəyirik.
Və yalnız kimi görünür ki,.
Biz orada onların hər biri üçün axtarır Belə ki, əgər biz bir şey tapa bilməz.
Amma ki, bunu həyata necə edir; yalnız əvvəl simli
normal ifade siz məktubu r qoydu.
>> OK, bizə davam edək.
Sağ All - bizə burada bir neçə təkrar nümunələri baxaq.
Beləliklə, siz nə etmək istəyirəm ki, bir şey şeyi təkrar edir
Mətn vasitəsilə axtarış edilir.
Belə ki, b hər hansı bir sıra ilə təqib etmək - siz ab * yoxdur.
Və sonra digər qaydalarının bir sıra var.
Və bu qədər bütün baxa bilərsiniz, mən yalnız bəzi axır olacaq
ən çox olanları istifadə olunur.
Belə ab + hər hansı bir n B 0 daha çox izləyir.
ab? bir b 0 və ya 1 izlədi.
ab {N} a b N izlədi, sonra belə edir.
Siz buruq aşırma 2 ədəd varsa bir sıra ifadə edilir
ki, bəlkə eşlemeli ola bilər.
Beləliklə, biz bir dəqiqə bir neçə təkrar nümunələri daha çox görünür.
Belə ki, burada alətləri uyğun bu model istifadə edərkən unutmayın 2 şeyi.
Biz hm baxmaq istəyirəm deyirəm "Abraham Lincoln vetçina sendviç edir."
Belə ki, Mən İbrahimə Abraham Lincoln adı dəyişdi.
Və indi bu axtarış funksiyası geri nə axtarır
və yalnız bu halda ham qaytarır.
Və axtarış yalnız təbii sol ən queue edir, çünki ki, yoxdur.
Və başqa hal nəzərdə tutulmayıbsa, bütün normal ifadeler edəcəyik.
Biz bütün tapmaq istəyirdi ki, bir funksiyası var - bütün tapa bilərsiniz.
Belə ki, yalnız bütün = re.findall (h.m ', mətn) kimi baxmaq bilər ki,
və sonra) (all.group.
Bütün vetçina və vetçina həm istehsal, hər bir kam bu halda həm İbrahim də tellər.
Belə ki, başqa bir variant edir.
>> Böyük. Unutmayın digər şey normal ifadeler daxilən ən böyük almaq edir.
Bizə bu misal baxaq.
Biz burada sol ən axtarış etdi, sonra mən daha böyük axtarış cəhd
ki, Kleene star operator istifadə edərək.
Belə ki, üçün, "Abraham Lincoln, vetçina sandviçler edir" və mən yalnız geri almış
nəticəsində m.
Ki, səhv səbəb mən hər hansı bir sayı da gedə bilərdik idi ki,
Mən h və m arasında getmək üçün bir şey göstərmədi, çünki h var.
M idi ki, orada yalnız nümunə - bu m ilə yalnız nümunələri
və h-nin bir sıra yalnız simli m idi.
Sonra yenidən cəhd, dedim, "OK, bizə burada faktiki ən böyük qrup almaq edək."
Və sonra h etdim. * M, yalnız h və m arasında simvol hər hansı bir sayı qaytarır ki.
Və yalnız həyata başlayan və tamam, yaxşı bu, Oh "edəcək düşünür əgər
Mənə vetçina olsun "faktiki Abraham Lincoln-ci h hər şey edir
vetçina sonuna bütün yol.
Bu görməmiş, bu h görür - bütün bunlar digər mətn - m,
və bu da edir nə
Bu xüsusilə egregious - bu biz həmçinin bir xüsusiyyət
, digər funksiyaları istifadə edərək görməmiş olmaq üçün daxil.
Amma bu biz xüsusilə unutmayın üçün bir şey deyil
HTML mətn baxan zaman, hansı bir səbəb ki,
normal ifadeler HTML üçün çətindir.
Çünki ortada bir HTML açıq tag və sonra məhsulları çox varsa
və sonra bir sıra digər HTML, proqram daha sonra tag bağlıdır
yalnız bəlkə səhvən HTML kodu bir çox yeyilmiş var.
>> Bütün hüququ - belə daha xüsusi simvollar, bir çox digər dillərdə kimi,
biz çizgi istifadə edərək xilas.
Beləliklə, biz yeni bir xətt istisna olmaqla, hər hansı bir xarakter belirlemek üçün dot istifadə edə bilərsiniz.
Biz hər hansı bir əlifba xarakter müəyyən etmək escape w istifadə edə bilərsiniz.
Və hər hansı bir tam üçün analogiya escape d - ədədi xarakter.
Biz daxil edə bilərsiniz - biz bağlı ifadələr müəyyən etmək üçün Mötərizədə istifadə edə bilərsiniz.
Belə ki, bu, b, c və ya qəbul olardı.
Və biz də müəyyən və ya A və ya B ya üçün variantları bilərsiniz.
- Məsələn, biz çox imkanlar axtarır, əgər
Mötərizədə biz kimi və ya operator istifadə edə bilər -
bizə burada bu nümunə geri gidelim.
Sonra bizə bu nümunə geri qoy, və - İndi bizi bildirin
AE almaq - bu qayıtmalıdırlar - Bu hələ İbrahim danışarlar.
Bu, - biz bütün nə varsa - böyük.
Belə ki, bizim burada mətn yeniləmə imkan verir.
"Onun hemming isə İbrahim vetçina yeyir -. Hemming isə" Böyük.
Bütün. Böyük. İndi vetçina, vetçina, və hem almaq.
Hemming isə - ona uğultu isə - hem ona uğultu edir. Böyük.
Eyni şey.
İndi bütün zümzümə və ya ona aldığınız olmadan hələ yalnız, vetçina vetçina, və hem qaytarır.
Böyük - biz ya baxmaq istəyirdi əgər belə nə - biz də edə bilər
onu və ya - biz ki, geri gələcək.
Okay - belə - bütün hüququ - vəzifələrdə siz də caret və ya dollar işarəsi istifadə edə bilərsiniz
Siz start bir şey və ya simli sonuna axtarır ki, müəyyən etmək üçün.
Və ya başlanğıc və ya bir söz sonunda.
Ki, istifadə etmək üçün bir yoldur.
>> Okay - bizə mətn bir qədər böyük bloku ilə ətrafında oynamaq edək.
Bizi burada Bu sırada deyim - bu bəyanat burada.
Normal ifade gücünü onlar nümunələri daxil edə bilərsiniz ki,
yalnız simvol sabit deyil.
Bizi edək - bizə bu blok zəng edək.
Sonra o da bütün oxuyacaq
Və sonra bir var - bizə = edək, biz faydalı burada axtarmaq bilər, bəzi şeylər belə nə var?
Biz ifadə qulaq axtarmaq bilər.
Çox maraqlı. Necə ki, haqqında? Biz nə görürsünüz.
Mən bunu bir problem verdi.
Belə ki, yenidən və bütün əvvəl şeyi hər hansı bir sayı.
Belə ki, ilin əvvəlinə qədər bəlkə də bütün yenidən bir neçə dəfə hər şey qayıtmalıdırlar.
Və sonra burada normal ifadeler qüdrəti var ki, onlar
nümunələri daxil edə bilərsiniz burada simvol deyil, yalnız var.
Belə qədər yekun yenidən bütün yol, bu sol ən ilə başladı və tamahkar idi.
Yanımızda görmək edək - Biz başqa nə ola bilər.
Siz əvəzlik axtarmaqda maraqlı olsam bir şey tapmaq o və o,
siz s 0 və ya 1-ə bərabər olması üçün kontrol bilər
və ifadə o ki, yəqin ki, qayıtmaq niyyətində deyil -
oh, mən orada biz burada, elektrik, O gün edilir axtarır, çünki o geri danışarlar.
Bizə bu şey əvvəlində gəlmişsə olduğunu ifadə edək.
Off damla bize nəzər salaq.
Beləliklə, biz yağ edə bilər, orada biz bir şey yoxdur, çünki o və o,
bu söz baş yoxdur.
Böyük. Okay - belə geri pişik burada.
Belə ki, kompleks nümunələri beyin zərər verir.
Biz bu məsələləri qarşısını almaq üçün normal ifadeler istifadə niyə belə edir.
>> Belə ki, burada sizinlə ətrafında oynaya bilər bir sıra digər faydalı rejimi.
Biz bu gün axtarış baxdı, ancaq matçı, split, findall, və qruplar istifadə edə bilərsiniz.
Yalnız başqa normal ifadeler ilə edə bilərsiniz digər cool şeylər
nümunələri üçün bir model alaraq və bütün matçları keçirilir -
onun dəyişənlər - və sonra sizin kodu o istifadə edir.
Bu olduqca faydalı ola bilər. Digər şeylər hesablanması bilər.
Beləliklə, biz bir normal ifade model hallarda sayı arxalana bilər
və biz qruplar istifadə edə bilərsiniz edir.
Və digər rejimləri, eləcə də mümkündür.
Beləliklə, mən yalnız normal ifadeler istifadə edə bilərsiniz digər yolları haqqında bir az daha danışmaq istəyirəm.
>> Belə ki, bir çox inkişaf etmiş proqram səlis eşleme edir.
Siz ifadə, Julius Sezar, bir mətn üçün axtarır Belə ki, əgər
və başqa dillərdə Gaius Julius Caesar və ya adı Julius Caesar ya bax
sonra siz də o dəyərləri bəzi çəki təyin edə bilərsiniz.
Və yaxın kifayət qədər olduqda - bu, müəyyən ərəfəsində keçir əgər - onda istədiyiniz
Julius Sezar qəbul etmək.
Belə ki, eləcə də bir neçə digər dillərdə ki, bir neçə müxtəlif tətbiqləri var.
Lazımlı bir az app online - Burada bir sıra digər alətlər, regex Pal var
Sizin normal ifadeler düzgün tərtib etmədiyinizi yoxlayın.
Sizin masa üstü çalıştırabilirsiniz ki, bağımsız alətləri də var
Ultra Pico, habelə yalnız tarifler kimi.
Əgər normal ifadeler bir ton nəzərdə tutan layihə edirik Belə ki, əgər
Bu yəqin ki, bu gün kənarda getmək üçün yerdir.
Və sonra yalnız nə qədər ortaq bir fikir verə
grep Unix var, Perl inşa-in malikdir və C C. üçün PCRE var
Və sonra bütün digər dillərdə də normal ifade paketlərin
ki, biz bu gün bir dad var mahiyyətcə eyni sintaksis ilə fəaliyyət göstərir.
PHP, Java, Ruby, və s.
>> Google Code Search həqiqətən qeyd edilməlidir, o biri
ictimai daxil olmaq üçün imkan verir ki, orada nisbətən neçə proqram
normal ifadeler istifadə edərək verilənlər bazası.
Google Code Search baxmaq Belə ki, əgər kod tapa bilərsiniz
bir funksiyası istifadə edilə bilər necə bir misal axtarır əgər,
müxtəlif hallarda bütün növ istifadə olunur ki, funksiyası tapmaq üçün normal ifade istifadə edə bilərsiniz.
Siz fwrite axtarmaq bilər, və sonra silinməsinin bayraq üçün baxmaq və ya oxuya bilər
Əgər bu halda istifadə olunur fwrite nümunəsi istəyirdi.
Burada, eyni orada şey, bəzi istinadlar var.
Bu hücumçu gedir, eləcə də mövcud online olacaq
Python, grep, Perl baxmaq istəyirəm - yalnız bir ilham almaq istəyirlər
burada nəzəriyyə daha çox baxmağa istəyirsinizsə və ya yerlərdə off yaxşı jumping edir.
Çox sağ olun.
[CS50.TV]