1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Seminarium: Mönstermatchning med reguljära uttryck] 2 00:00:02,000 --> 00:00:04,000 [John Mussman-Harvard University] 3 00:00:04,000 --> 00:00:07,220 [Detta är CS50.-CS50.TV] 4 00:00:07,780 --> 00:00:11,610 Okej. Tja, välkommen alla. Detta är CS50 2012. 5 00:00:11,780 --> 00:00:16,610 Mitt namn är John, och jag kommer att prata idag om reguljära uttryck. 6 00:00:16,610 --> 00:00:22,530 Reguljära uttryck är främst ett verktyg, men också ibland används 7 00:00:22,530 --> 00:00:28,650 i koden aktivt huvudsak matcha mönster och strängar. 8 00:00:28,650 --> 00:00:33,800 Så här är en web comic från xkcd. 9 00:00:34,440 --> 00:00:42,370 I denna serie finns en mordgåta där mördaren har 10 00:00:42,370 --> 00:00:47,860 följt någon på semester, och huvudpersonerna har att 11 00:00:47,860 --> 00:00:52,500 söka igenom 200 megabyte e-postmeddelanden som söker efter en adress. 12 00:00:52,500 --> 00:00:56,090 Och de är på väg att ge upp när någon som vet reguljära uttryck - 13 00:00:56,090 --> 00:01:00,550 förmodligen en superhjälte - sveper ner och skriver lite kod 14 00:01:00,550 --> 00:01:02,970 och löser mordgåta. 15 00:01:02,970 --> 00:01:07,370 Så förmodligen som kommer att vara något som du kommer att ha befogenhet att göra 16 00:01:07,370 --> 00:01:09,370 Efter detta seminarium. 17 00:01:09,370 --> 00:01:12,250 Vi kommer bara att ge en kortfattad introduktion till språket 18 00:01:12,250 --> 00:01:16,770 och ge dig tillräckligt med resurser för att gå efter mer resurser på egen hand. 19 00:01:17,680 --> 00:01:21,700 >> Så reguljära uttryck ser i princip ut så här. 20 00:01:22,930 --> 00:01:25,550 Detta är ett vanligt uttryck i Ruby. 21 00:01:25,550 --> 00:01:29,280 Det är inte så väldigt annorlunda på flera språk. 22 00:01:29,690 --> 00:01:37,630 Vi har bara på snedstreck för att börja och markera det reguljära uttrycket i Ruby. 23 00:01:37,630 --> 00:01:42,880 Och detta är ett reguljärt uttryck för att leta efter i e-postadress mönster. 24 00:01:42,880 --> 00:01:49,160 Så vi ser på den första biten ser för alla alfanumeriska tecken. 25 00:01:50,500 --> 00:01:54,880 Det beror på e-postadresser ofta måste börja med en bokstav. 26 00:01:55,460 --> 00:01:59,330 Och sedan någon speciell karaktär följt av tecknet @. 27 00:01:59,330 --> 00:02:03,260 Och sedan samma sak för domännamn. 28 00:02:03,260 --> 00:02:10,030 Och sedan mellan 2 och 4 tecken för att leta efter den. Com,. Net, och så vidare. 29 00:02:10,850 --> 00:02:13,200 Så det är ett annat exempel på reguljära uttryck. 30 00:02:13,200 --> 00:02:17,270 Så reguljära uttryck är protokoll för att hitta smattrar i text. 31 00:02:17,270 --> 00:02:21,130 De gör jämförelser, val, och utbyten. 32 00:02:21,690 --> 00:02:27,970 Så ett tredje exempel är att hitta alla telefonnummer som slutar på 54 i en katalog. 33 00:02:27,970 --> 00:02:34,360 Så innan David sliter upp CS50 katalogen vi kunde söka 34 00:02:34,360 --> 00:02:40,450 ett mönster där vi har parenteser därefter 3 siffror hamnar då parentes, 35 00:02:40,450 --> 00:02:44,070 Ytterligare 3 siffror, ett bindestreck, 2 siffror, och sedan 54. 36 00:02:44,070 --> 00:02:48,310 Och det skulle i stort sett hur vi kommit fram till ett reguljärt uttryck för att söka efter det. 37 00:02:49,150 --> 00:02:52,960 >> Så det finns - vi har gjort en del saker i CS50 som är lite som att 38 00:02:52,960 --> 00:02:59,740 reguljära uttryck, så - till exempel - i dictionary.C filen 39 00:02:59,740 --> 00:03:04,720 för stavningskontroll problemet set du kan ha använt fscanf 40 00:03:04,720 --> 00:03:07,930 att läsa in ett ord från ordlistan. 41 00:03:07,930 --> 00:03:16,240 Och du kan se den procentuella 45s är ute efter en sträng med 45 tecken. 42 00:03:16,240 --> 00:03:20,020 Så det är något som en rudimentär reguljärt uttryck. 43 00:03:21,150 --> 00:03:26,060 Och du kan ha några 45 tecken som passar räkningen i det 44 00:03:26,060 --> 00:03:28,080 och plocka upp dem. 45 00:03:28,080 --> 00:03:33,480 Och sedan det andra exemplet i den senaste webbprogrammering problem 46 00:03:33,480 --> 00:03:40,760 satt i distro kod för php vi gör faktiskt har en enkel reguljära uttryck. 47 00:03:40,760 --> 00:03:46,790 Och detta är bara helt enkelt ute efter att kontrollera om webbsidan som skickas i 48 00:03:46,790 --> 00:03:51,940 matchar antingen logga in eller logga registrera. PHP. 49 00:03:52,220 --> 00:03:57,910 Och sedan återvänder sant eller falskt baserat på det reguljära uttryck matchning. 50 00:03:59,400 --> 00:04:01,740 >> Så när använder du reguljära uttryck? 51 00:04:01,740 --> 00:04:04,820 Varför är du här idag? 52 00:04:05,330 --> 00:04:08,480 Så du vill inte använda reguljära uttryck när det är något som 53 00:04:08,480 --> 00:04:11,640 gör jobbet åt dig ännu enklare. 54 00:04:11,640 --> 00:04:15,510 Så XML och HTML är faktiskt ganska knepigt 55 00:04:15,510 --> 00:04:18,480 att skriva reguljära uttryck för när vi kommer att se i en liten bit. 56 00:04:19,110 --> 00:04:23,280 Så det finns särskilda tolkar för dessa språk. 57 00:04:24,170 --> 00:04:30,060 Du måste också vara okej med avvägningar och noggrannhet ofta. 58 00:04:30,060 --> 00:04:36,220 Om du försöker - så såg vi ett reguljärt uttryck för en e-postadress, 59 00:04:37,370 --> 00:04:42,590 men att säga att du ville ha en särskild e-postadress och gradvis 60 00:04:42,590 --> 00:04:48,570 reguljära uttryck kan bli mer komplicerad eftersom det blev mer exakt. 61 00:04:49,580 --> 00:04:52,260 Så det skulle vara en avvägning. 62 00:04:52,260 --> 00:04:55,330 Du måste vara säker på att du okej gör med det reguljära uttrycket. 63 00:04:55,330 --> 00:04:57,920 Om du vet exakt vad du letar efter det kanske vettigare 64 00:04:57,920 --> 00:05:02,070 att sätta i gång och skriva ett effektivare parser. 65 00:05:02,070 --> 00:05:06,980 Och slutligen finns det en historisk fråga med regelbundenhet 66 00:05:06,980 --> 00:05:08,940 av uttryck och språk. 67 00:05:08,940 --> 00:05:12,960 Reguljära uttryck är faktiskt mycket mer kraftfull än 68 00:05:12,960 --> 00:05:16,450 reguljära uttryck per säga i formell mening. 69 00:05:17,130 --> 00:05:20,150 >> Så jag vill inte gå för långt i den formella teorin, 70 00:05:20,150 --> 00:05:24,000 men de flesta språk som vi kod i själva verket inte är regelbunden. 71 00:05:24,000 --> 00:05:29,110 Och det är därför reguljära uttryck ibland inte betraktas allt som säker. 72 00:05:29,670 --> 00:05:33,150 Så i princip finns det ett Chomsky hierarki för språk, 73 00:05:33,150 --> 00:05:38,400 och reguljära uttryck är uppbyggda med hjälp av facket, sammanlänkning, 74 00:05:38,400 --> 00:05:41,810 och Kleene stjärnan operation som vi kommer att se i ett par minuter. 75 00:05:43,130 --> 00:05:48,860 Om du är intresserad av teorin finns det en hel del som händer där under huven. 76 00:05:50,360 --> 00:05:55,880 >> Så en kort historik - bara för sammanhanget här - regelbundna uppsättningar kom upp 77 00:05:55,880 --> 00:05:59,580 på 1950-talet, och då hade vi enkla redaktörer som 78 00:05:59,580 --> 00:06:03,300 införlivas reguljära uttryck - att bara söka efter strängar. 79 00:06:03,570 --> 00:06:09,110 Grep - vilket är ett kommandoradsverktyg - var en av de första 80 00:06:09,110 --> 00:06:14,160 mycket populära verktyg som ingår reguljära uttryck på 1960-talet. 81 00:06:14,160 --> 00:06:20,560 Under 80-talet, var Perl byggd - är ett programmeringsspråk som 82 00:06:20,560 --> 00:06:24,110 inkorporerar reguljära uttryck väldigt framträdande. 83 00:06:24,550 --> 00:06:30,130 Och sedan mer nyligen har vi haft Perl kompatibla reguljära uttryck 84 00:06:30,130 --> 00:06:35,870 protokoll i princip på andra språk som använder mycket av samma syntax. 85 00:06:36,630 --> 00:06:39,840 Naturligtvis den viktigaste händelsen var 2008 86 00:06:39,840 --> 00:06:43,040 där det var den första nationella Regular Expressions Dag, 87 00:06:43,040 --> 00:06:47,350 som jag tror är den 1 juni om du vill fira det. 88 00:06:48,430 --> 00:06:50,840 >> Återigen, bara lite mer teori här. 89 00:06:52,180 --> 00:06:55,320 Så det finns ett par olika sätt att konstruera reguljära uttryck. 90 00:06:55,950 --> 00:07:02,050 Ett enkelt sätt är att bygga ett uttryck som du ska 91 00:07:02,050 --> 00:07:07,500 köra på strängen tolkar - i princip bygga en liten mini-program som 92 00:07:07,500 --> 00:07:11,870 kommer att analysera delar av en sträng och se, "Åh, passar detta reguljära uttryck eller inte?" 93 00:07:12,250 --> 00:07:14,250 Och sedan köra det. 94 00:07:14,250 --> 00:07:17,300 Så om du har en mycket liten reguljära uttryck, är detta troligen 95 00:07:17,300 --> 00:07:19,380 det mest effektiva sättet att göra det. 96 00:07:20,090 --> 00:07:25,420 Och sedan om du - ett annat alternativ är att hålla rekonstruera 97 00:07:25,420 --> 00:07:30,260 uttryck som du går, och det är simulera möjligheten. 98 00:07:30,440 --> 00:07:37,690 Och dessa tidiga försök till reguljära uttryck algoritmer var 99 00:07:37,690 --> 00:07:44,330 relativt enkelt och relativt snabbt, men hade inte en stor flexibilitet. 100 00:07:44,330 --> 00:07:47,500 Så för att göra även några av de saker som vi kommer att titta på 101 00:07:47,500 --> 00:07:52,860 idag har vi haft att göra mer komplexa reguljära uttryck 102 00:07:52,860 --> 00:07:56,650 implementeringar som är potentiellt mycket långsammare, så det är något att ha i åtanke 103 00:07:57,510 --> 00:08:02,920 Det finns också en regelbunden uttryck förnekande av attack sort 104 00:08:02,920 --> 00:08:08,330 att utnyttja potentialen för dessa nyare implementeringar av 105 00:08:08,330 --> 00:08:10,930 reguljära uttryck för att bli mycket komplex. 106 00:08:11,570 --> 00:08:15,650 Och på samma sätt som vi såg i attacker buffertspill, 107 00:08:15,650 --> 00:08:21,610 du har attacker som verkar genom att göra rekursiva slingor som 108 00:08:21,610 --> 00:08:24,400 överskridande kapaciteten hos minnet. 109 00:08:24,780 --> 00:08:29,540 Och förresten Regexen är ett av de officiella pluralformer av reguljära uttryck 110 00:08:29,540 --> 00:08:32,890 analogt till oxar i den anglosaxiska. 111 00:08:33,500 --> 00:08:40,169 >> Okej, så det Python Library många av er här personligen har Mac, 112 00:08:40,169 --> 00:08:43,860 så du kan faktiskt dra upp detta på din skärm. 113 00:08:43,860 --> 00:08:47,480 Reguljära uttryck är inbyggda i Python. 114 00:08:48,070 --> 00:08:53,020 Och så Python är förinstallerad på Mac-datorer och även tillgängligt online på denna länk. 115 00:08:53,770 --> 00:08:57,350 Så om du tittar på kan du pausa och se till att du har Python 116 00:08:58,080 --> 00:09:00,170 som vi leka här. 117 00:09:00,780 --> 00:09:06,420 Det är en manuell på nätet, så om du bara skriver Python i din dator 118 00:09:06,420 --> 00:09:10,500 kommer du att se att den versionen kommer upp i terminalen. 119 00:09:11,070 --> 00:09:17,720 Så jag gav en länk till manualen för version 2 av Python samt en fusklapp. 120 00:09:17,720 --> 00:09:23,100 Det finns en version 3 av Python, men din Mac inte nödvändigtvis 121 00:09:23,100 --> 00:09:25,130 komma med det förinstallerade. 122 00:09:25,130 --> 00:09:27,360 Så inte så väldigt annorlunda. 123 00:09:27,360 --> 00:09:33,270 Okej, så några grunderna i att använda reguljära uttryck i Python. 124 00:09:34,080 --> 00:09:42,650 >> Så här har jag använt en mycket enkelt uttryck, så jag gjorde Python import re 125 00:09:43,750 --> 00:09:47,070 och tog sedan resultatet av re.search. 126 00:09:47,070 --> 00:09:49,910 Och sökandet tar 2 argument. 127 00:09:49,910 --> 00:09:56,040 Den första är det reguljära uttrycket, och den andra är texten 128 00:09:56,040 --> 00:09:58,290 eller sträng som du vill analysera. 129 00:09:58,290 --> 00:10:01,210 Och då jag skrev ut result.group. 130 00:10:01,580 --> 00:10:05,860 Så dessa är de två grundläggande funktioner vi kommer att se i dag 131 00:10:06,790 --> 00:10:10,170 att lära om reguljära uttryck. 132 00:10:10,170 --> 00:10:12,880 Så bara bryta ner detta reguljära uttryck här 133 00:10:12,880 --> 00:10:21,770 h och sedan \ w och sedan m så \ w accepterar bara någon bokstav i det. 134 00:10:21,850 --> 00:10:26,820 Så här är vi letar efter ett "h" och sedan en annan bokstav 135 00:10:26,820 --> 00:10:30,060 och därefter m, så här som skulle matcha skinka 136 00:10:30,060 --> 00:10:34,480 i, "Abraham Lincoln och skinka smörgåsar." 137 00:10:35,040 --> 00:10:37,150 Detta är resultatet av den gruppen. 138 00:10:37,680 --> 00:10:43,130 En annan sak som vi kan göra är att använda våra före textsträngar i Python. 139 00:10:43,130 --> 00:10:46,220 Så jag antar att jag kommer att gå vidare och dra upp det här. 140 00:10:46,220 --> 00:10:49,210 Python import re. 141 00:10:50,070 --> 00:10:54,000 Och om jag skulle göra samma sak - låt oss säga text är, 142 00:10:55,390 --> 00:11:00,800 "Abraham," låt oss zooma in - där vi går. 143 00:11:01,610 --> 00:11:06,430 Text är, "Abraham äter skinka." 144 00:11:07,460 --> 00:11:15,260 Okej, och sedan leda = re.search. 145 00:11:16,260 --> 00:11:22,020 Och så vårt uttryck kan vara h, och då kommer jag att göra dot m. 146 00:11:22,020 --> 00:11:26,280 Så dot tar bara alla tecken som inte är en ny linje med siffror, 147 00:11:26,280 --> 00:11:28,650 procentenheter tecken, något liknande. 148 00:11:28,650 --> 00:11:38,030 Och sedan text - boom - och sedan result.group--ja. 149 00:11:38,030 --> 00:11:41,820 Så det är bara hur man ska genomföra grundläggande funktionalitet här. 150 00:11:42,300 --> 00:11:55,110 Om vi ​​hade en text ring som - det galna text - inkluderat säga massor av back snedstreck 151 00:11:55,110 --> 00:12:01,180 och strängar inne och saker som skulle kunna se ut escape-sekvenser, 152 00:12:01,180 --> 00:12:08,480 då vi vill nog använda den råa textinmatning för att säkerställa att accepteras. 153 00:12:08,480 --> 00:12:14,120 Och som bara ser ut så. 154 00:12:14,120 --> 00:12:17,810 Så om vi letade efter vart och ett av dem där vi inte skulle hitta något. 155 00:12:19,070 --> 00:12:21,680 Men det är hur du skulle genomföra det, strax innan strängen av 156 00:12:21,680 --> 00:12:24,990 det reguljära uttrycket du sätter bokstaven r.. 157 00:12:26,150 --> 00:12:30,260 >> Okej, så låt oss fortsätta. 158 00:12:30,260 --> 00:12:33,730 Okej - så låt oss titta på ett par repetitiva mönster här. 159 00:12:34,750 --> 00:12:39,150 Så en sak som du vill göra är att upprepa saker 160 00:12:40,040 --> 00:12:42,480 när du söker igenom text. 161 00:12:42,480 --> 00:12:48,300 Så för att göra en följt av valfritt antal B - du gör ab *. 162 00:12:48,630 --> 00:12:51,620 Och sedan finns det en rad andra regler också. 163 00:12:51,620 --> 00:12:54,380 Och du kan se alla dessa upp, jag ska bara gå igenom en del av den 164 00:12:54,380 --> 00:12:57,630 mest använda sådana. 165 00:12:57,630 --> 00:13:03,920 Så ab + är en följd av något N större än 0 i b.. 166 00:13:04,510 --> 00:13:08,000 ab? är en följd av 0 eller 1 av b.. 167 00:13:09,190 --> 00:13:18,580 ab {N} är en följd av N av b, och sedan så vidare. 168 00:13:18,580 --> 00:13:22,820 Om du har 2 nummer i klammerparenteser du anger ett intervall 169 00:13:23,300 --> 00:13:25,440 som kan vara eventuellt matchas. 170 00:13:26,390 --> 00:13:30,420 Så vi kommer att titta mer på ett par återkommande mönster i en minut. 171 00:13:31,960 --> 00:13:42,300 Så 2 saker att tänka på när du använder dessa mönstermatchning verktyg här. 172 00:13:42,300 --> 00:13:52,120 Så säger vi vill titta på hm av, "Abraham Lincoln gör skinka smörgåsar." 173 00:13:52,120 --> 00:13:55,230 Så jag bytte Abraham Lincoln namn till Abraham. 174 00:13:55,230 --> 00:14:00,290 Och nu söker vi för vad som returneras av denna sökfunktion, 175 00:14:00,290 --> 00:14:03,270 och den återvänder bara skinka i det här fallet. 176 00:14:03,620 --> 00:14:08,080 Och det gör det eftersom sökningen bara naturligt tar den vänstra mest kö. 177 00:14:08,080 --> 00:14:12,130 Och alla reguljära uttryck om du inte anger annat kommer att göra det. 178 00:14:12,830 --> 00:14:18,880 Om vi ​​ville hitta allt finns det en funktion för att - hitta alla. 179 00:14:18,880 --> 00:14:35,100 Så att bara kunde se ut som alla = re.findall ('h.m ", text) 180 00:14:35,100 --> 00:14:44,540 och sedan all.group (). 181 00:14:44,540 --> 00:14:51,040 Alla producerar både skinka och skinka, i detta fall de båda strängarna i Abraham varje skinka. 182 00:14:51,610 --> 00:14:55,110 Så det är ett annat alternativ. 183 00:14:56,250 --> 00:15:06,940 >> Jättebra. Den andra saken att tänka på är att reguljära uttryck tar den största intuitivt. 184 00:15:06,940 --> 00:15:09,520 Låt oss titta på detta exempel. 185 00:15:10,200 --> 00:15:16,070 Vi gjorde det vänstra mest söka här, och då jag försökte en större sökning 186 00:15:16,070 --> 00:15:18,800 använder Kleene stjärnan operatören. 187 00:15:18,800 --> 00:15:24,180 Så för, "Abraham Lincoln gör skinka smörgåsar," och jag bara fick tillbaka 188 00:15:24,180 --> 00:15:26,280 m som följd. 189 00:15:26,280 --> 00:15:31,670 Anledningen till det misstaget var att jag kunde ha tagit ett antal 190 00:15:31,670 --> 00:15:36,140 h är eftersom jag inte angav något att gå in mellan h och m.. 191 00:15:36,140 --> 00:15:42,010 Det enda exemplet där som hade m - de enda exemplen där med m i det 192 00:15:42,010 --> 00:15:46,220 och valfritt antal h s var bara strängen m. 193 00:15:46,490 --> 00:15:51,850 Sedan försökte jag det igen, jag sa, "Okej, låt oss få den faktiska största gruppen här." 194 00:15:51,850 --> 00:15:59,670 Och då gjorde jag h.. * M, så att bara returnerar antal tecken mellan h och m.. 195 00:16:00,280 --> 00:16:02,950 Och om du just har börjat och tänka, "Åh, kommer okej, väl detta 196 00:16:02,950 --> 00:16:11,560 få mig skinka, "det tar faktiskt allt från h på Abraham Lincoln 197 00:16:11,560 --> 00:16:13,690 ända fram till slutet av skinka. 198 00:16:14,040 --> 00:16:18,110 Det är giriga, det ser h - allt detta andra text - m, 199 00:16:18,110 --> 00:16:21,280 och det är vad det tar i. 200 00:16:22,060 --> 00:16:27,480 Detta är en särskilt egregious - detta är en funktion som vi kan också 201 00:16:27,480 --> 00:16:30,670 anger för det inte vara girig använda andra funktioner. 202 00:16:31,480 --> 00:16:34,490 Men detta är något vi måste tänka på speciellt 203 00:16:34,490 --> 00:16:38,720 när man tittar på HTML-text, vilket är en anledning till att 204 00:16:38,720 --> 00:16:41,500 reguljära uttryck är svårt för HTML. 205 00:16:42,460 --> 00:16:46,310 För om du har en HTML öppen tagg och sedan massor av grejer i mitten 206 00:16:46,310 --> 00:16:49,820 och lite annat HTML stängt taggen långt senare i programmet, 207 00:16:49,820 --> 00:16:55,420 du har precis ätit upp en hel del av HTML-koden möjligen av misstag. 208 00:16:56,200 --> 00:17:01,840 >> Alla rätt - så mer specialtecken, liksom många andra språk, 209 00:17:01,840 --> 00:17:04,780 vi fly med snedstreck. 210 00:17:04,780 --> 00:17:10,329 Så vi kan använda prick för att ange alla tecken med undantag för en ny linje. 211 00:17:10,329 --> 00:17:14,550 Vi kan använda escape w för att ange någon bokstav. 212 00:17:14,550 --> 00:17:20,329 Och analogt fly d för något heltal - numeriska tecken. 213 00:17:20,630 --> 00:17:27,440 Vi kan ange - vi kan använda parenteser för att specificera besläktade uttryck. 214 00:17:27,440 --> 00:17:30,970 Så detta skulle acceptera a, b eller c. 215 00:17:31,320 --> 00:17:37,000 Och vi kan också ange eller alternativ för antingen a eller b. 216 00:17:37,000 --> 00:17:41,110 Till exempel - om vi söker flera möjligheter 217 00:17:41,110 --> 00:17:44,940 inom parentes vi kunde använda den eller operatören som i - 218 00:17:44,940 --> 00:17:52,480 så låt oss gå tillbaka till exemplet här. 219 00:17:53,000 --> 00:17:59,790 Och låt oss nu ta - låt oss gå tillbaka till exemplet här, och sedan 220 00:17:59,790 --> 00:18:12,290 ta ae - så här ska återvända - jag antar att detta är fortfarande Abraham. 221 00:18:12,290 --> 00:18:17,410 Så detta - om vi gör allt - bra. 222 00:18:17,410 --> 00:18:22,700 Så låt oss uppdatera texten här. 223 00:18:22,700 --> 00:18:34,690 "Abraham äter skinka medan fålla hans -. Medan fållning" Jättebra. 224 00:18:44,090 --> 00:18:47,330 Alla. Jättebra. Nu får vi skinka, skinka, och nertill. 225 00:18:48,510 --> 00:18:59,370 Medan fålla - samtidigt nynna för honom - samtidigt nynna till fåll honom. Jättebra. 226 00:19:00,350 --> 00:19:03,250 Samma sak. 227 00:19:03,820 --> 00:19:09,180 Nu är allt återvänder fortfarande bara skinka, skinka, och nertill utan att plocka upp på brum eller honom. 228 00:19:09,940 --> 00:19:22,600 Stor - så tänk om vi ville titta på någon som - så vi kunde också göra 229 00:19:23,510 --> 00:19:33,810 honom eller - vi kommer att återkomma till detta. 230 00:19:34,810 --> 00:19:45,760 Okej - så - okej - i positioner du kan också använda cirkumflex eller dollartecken 231 00:19:45,760 --> 00:19:49,350 att ange att du letar efter något i början eller slutet av en sträng. 232 00:19:50,260 --> 00:19:52,260 Eller i början eller slutet av ett ord. 233 00:19:52,400 --> 00:19:54,470 Det är ett sätt att använda detta. 234 00:19:55,630 --> 00:20:01,160 >> Okej - så låt oss leka med en något större textblock. 235 00:20:03,950 --> 00:20:08,310 Låt oss säga att denna raden här - detta uttalande här. 236 00:20:08,310 --> 00:20:11,360 Kraften av reguljära uttryck är att de kan specificera mönster 237 00:20:11,360 --> 00:20:13,390 inte bara fasta tecken. 238 00:20:14,900 --> 00:20:18,790 Låt oss göra - låt oss kalla detta block. 239 00:20:22,400 --> 00:20:27,110 Då kommer vi att läsa allt detta i. 240 00:20:28,890 --> 00:20:50,820 Och sedan ha en - låt oss göra alla =, så vad är några saker som vi kunde söka in här lönsamt? 241 00:20:50,820 --> 00:20:54,070 Vi kunde se för uttrycket örat. 242 00:20:55,050 --> 00:21:01,520 Inte mycket intressant. Vad sägs om det? Vi får se vad som händer. 243 00:21:03,710 --> 00:21:05,710 Jag gav det ett problem. 244 00:21:06,380 --> 00:21:10,750 Så valfritt antal saker innan du och alla. 245 00:21:10,750 --> 00:21:15,630 Så det borde återvända allt från början till alla åter kanske ett par gånger. 246 00:21:18,800 --> 00:21:21,970 Och så här har vi makt reguljära uttryck är att de 247 00:21:21,970 --> 00:21:24,900 kan specificera mönster inte bara tecken här är. 248 00:21:24,900 --> 00:21:28,510 Så hela vägen fram till den slutliga re, började den med vänster mest och var giriga. 249 00:21:30,710 --> 00:21:32,710 Låt oss se - vad kan vi leta efter. 250 00:21:32,710 --> 00:21:39,860 Jag antar att en sak om du var intresserad av att leta efter de pronomen hon och han, 251 00:21:39,860 --> 00:21:44,600 du kan kontrollera för s är lika med 0 eller 1 252 00:21:44,600 --> 00:21:49,710 och uttrycket han, och som förmodligen inte kommer att återvända - 253 00:21:49,710 --> 00:21:58,020 åh, jag antar att det återvände han för att det vi ser på makt, den dagen är här. 254 00:22:00,590 --> 00:22:06,270 Låt oss försöka specificera att detta måste komma i början av någonting. 255 00:22:06,640 --> 00:22:09,530 Låt oss se om det sjunker. 256 00:22:09,530 --> 00:22:19,630 Så vi kan göra fett, och det vi inte får något eftersom hon och han 257 00:22:19,630 --> 00:22:22,870 förekommer inte i denna fras. 258 00:22:24,960 --> 00:22:30,410 Jättebra. Okej - så tillbaka till katten här. 259 00:22:30,410 --> 00:22:35,720 Så komplexa mönster skadar hjärnan. 260 00:22:35,720 --> 00:22:40,500 Så det är därför vi använder reguljära uttryck för att undvika dessa problem. 261 00:22:40,820 --> 00:22:43,520 >> Så här är några andra användbara lägen du kan leka med. 262 00:22:43,520 --> 00:22:50,290 Vi tittade på sökning idag, men du kan också använda match, split, findall och grupper. 263 00:22:50,290 --> 00:22:53,970 Så andra coola saker du kan göra med reguljära uttryck Förutom att bara 264 00:22:53,970 --> 00:22:58,870 leta efter mönster tar ett mönster och hålla alla matcher - 265 00:22:58,870 --> 00:23:02,530 dess variabler - och sedan använda dem i din kod senare. 266 00:23:02,850 --> 00:23:05,980 Det kan vara ganska bra. Andra saker kan räkna. 267 00:23:05,980 --> 00:23:11,720 Så vi kan räkna antalet förekomster av ett mönster för reguljära uttryck, 268 00:23:11,720 --> 00:23:13,960 och det är vad vi kan använda grupper för. 269 00:23:13,960 --> 00:23:17,550 Och andra lägen samt är också möjliga. 270 00:23:18,040 --> 00:23:22,980 Så jag vill bara prata lite mer om andra sätt du kan använda reguljära uttryck. 271 00:23:22,980 --> 00:23:29,100 >> Så en mer avancerad applikation är fuzzy matchning. 272 00:23:29,100 --> 00:23:33,450 Så om du letar efter en text för uttrycket, Julius Caesar, 273 00:23:33,450 --> 00:23:37,740 och du ser antingen Gaius Julius Caesar eller namnet Julius Caesar i andra språk, 274 00:23:37,740 --> 00:23:44,400 då kanske du också vill ge lite tyngd till dessa värden. 275 00:23:44,400 --> 00:23:48,930 Och om det är nära nog - om den korsar en viss tröskel - då du vill 276 00:23:48,930 --> 00:23:50,860 att kunna ta emot Julius Caesar. 277 00:23:50,860 --> 00:24:00,580 Så det finns ett par olika implementationer för att i några andra språk. 278 00:24:02,580 --> 00:24:08,420 Här är några andra verktyg, Regex PAL - en behändig liten app nätet till 279 00:24:08,420 --> 00:24:12,190 kontrollera om dina reguljära uttryck består korrekt. 280 00:24:12,190 --> 00:24:18,500 Det finns också fristående verktyg som du kan köra från skrivbordet 281 00:24:18,500 --> 00:24:22,100 som Ultra Pico, och liksom bara kokböcker. 282 00:24:22,100 --> 00:24:25,410 Så om du gör ett projekt som involverar massor av reguljära uttryck 283 00:24:25,410 --> 00:24:29,810 Detta är förmodligen den plats att gå utanför idag. 284 00:24:31,520 --> 00:24:35,770 Och sedan bara för att ge dig en känsla av hur vanligt det är 285 00:24:35,770 --> 00:24:44,090 det finns grep i Unix, har Perl inbyggd, och C finns det PCRE för C. 286 00:24:44,090 --> 00:24:48,890 Och sedan alla dessa andra språk har också reguljära uttryck paket 287 00:24:48,890 --> 00:24:52,020 som arbetar med väsentligen samma syntax som vi fick en smak av idag. 288 00:24:52,020 --> 00:24:54,790 PHP, Java, Ruby, och så vidare. 289 00:24:56,080 --> 00:24:58,980 >> Google Code Search är faktiskt värt att nämna, det är en av de 290 00:24:58,980 --> 00:25:05,720 relativt få program där ute som gör allmänheten att få tillgång till 291 00:25:05,720 --> 00:25:07,800 sin databas med reguljära uttryck. 292 00:25:07,800 --> 00:25:12,920 Så om du tittar på Google Code Search hittar koden 293 00:25:12,920 --> 00:25:16,880 Om du letar efter ett exempel på hur en funktion kan användas, 294 00:25:16,880 --> 00:25:21,610 Du kan använda ett reguljärt uttryck för att finna denna funktion används i alla möjliga olika ärenden. 295 00:25:21,610 --> 00:25:28,000 Du kan leta efter fwrite, och sedan kan du leta efter flagga skriva eller läsa 296 00:25:28,000 --> 00:25:32,000 om du ville ha ett exempel på fwrite som används i det fallet. 297 00:25:33,530 --> 00:25:37,010 Så samma sak där, och här är några referenser. 298 00:25:37,010 --> 00:25:40,990 Detta kommer att vara tillgängliga på nätet också, så gå framåt om 299 00:25:40,990 --> 00:25:45,560 du vill titta på Python, grep, Perl - du vill bara få lite inspiration 300 00:25:45,560 --> 00:25:50,650 eller om du vill titta mer på teorin här är några bra hoppning av platser. 301 00:25:50,650 --> 00:25:53,870 Tack så mycket. 302 00:25:58,470 --> 00:25:59,910 [CS50.TV]