1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Seminar: Pattern Matching med Regular Expressions] 2 00:00:02,000 --> 00:00:04,000 [John Mussman-Harvard University] 3 00:00:04,000 --> 00:00:07,220 [Dette er CS50.-CS50.TV] 4 00:00:07,780 --> 00:00:11,610 Okay. Nå, velkommen alle. Dette er CS50 2012. 5 00:00:11,780 --> 00:00:16,610 Mit navn er John og jeg vil tale i dag om regulære udtryk. 6 00:00:16,610 --> 00:00:22,530 Regulære udtryk er primært et værktøj, men også undertiden bruges 7 00:00:22,530 --> 00:00:28,650 i kode aktivt til væsentlige matche mønstre og strygere. 8 00:00:28,650 --> 00:00:33,800 Så her er en web-tegneserie fra xkcd. 9 00:00:34,440 --> 00:00:42,370 I denne tegneserie er der en mordgåde, hvor morderen har 10 00:00:42,370 --> 00:00:47,860 fulgt nogen på ferie, og hovedpersonerne er nødt til at 11 00:00:47,860 --> 00:00:52,500 søge gennem 200 megabyte af e-mails på udkig efter en adresse. 12 00:00:52,500 --> 00:00:56,090 Og de er ved at give op, når nogen, der kender regulære udtryk - 13 00:00:56,090 --> 00:01:00,550 formentlig en superhelt - swoops ned og skriver noget kode 14 00:01:00,550 --> 00:01:02,970 og løser mordgåde. 15 00:01:02,970 --> 00:01:07,370 Så formentlig, der vil være noget, som du vil blive bemyndiget til at gøre 16 00:01:07,370 --> 00:01:09,370 efter dette seminar. 17 00:01:09,370 --> 00:01:12,250 Vi er bare nødt til at give en kortfattet introduktion til sproget 18 00:01:12,250 --> 00:01:16,770 og give dig nok midlerne til at gå efter flere ressourcer på egen hånd. 19 00:01:17,680 --> 00:01:21,700 >> Så regulære udtryk se dybest set sådan ud. 20 00:01:22,930 --> 00:01:25,550 Dette er et regulært udtryk i Ruby. 21 00:01:25,550 --> 00:01:29,280 Det er ikke forfærdelig forskellig på tværs af sprog. 22 00:01:29,690 --> 00:01:37,630 Vi har netop på flænger at begynde og markere det regulære udtryk i Ruby. 23 00:01:37,630 --> 00:01:42,880 Og det er et regulært udtryk til at søge i e-mail-adresse mønster. 24 00:01:42,880 --> 00:01:49,160 Så vi ser på det første bit ser for enhver alfanumeriske tegn. 25 00:01:50,500 --> 00:01:54,880 Det er fordi e-mail adresser ofte nødt til at starte med et bogstav. 26 00:01:55,460 --> 00:01:59,330 Og så nogen særlig tegn efterfulgt af @-symbolet. 27 00:01:59,330 --> 00:02:03,260 Og så det samme for domænenavn. 28 00:02:03,260 --> 00:02:10,030 Og så mellem 2 og 4 tegn at lede efter den. Com,. Net, og så videre. 29 00:02:10,850 --> 00:02:13,200 Så det er endnu et eksempel på regulære udtryk. 30 00:02:13,200 --> 00:02:17,270 Så regulære udtryk er protokoller for at finde mønstre i tekst. 31 00:02:17,270 --> 00:02:21,130 De gør sammenligninger, markeringer og udskiftninger. 32 00:02:21,690 --> 00:02:27,970 Så et tredje eksempel er at finde alle de telefonnumre, der sluttede i 54 i en mappe. 33 00:02:27,970 --> 00:02:34,360 Så før David river op CS50 biblioteket, vi kunne søge 34 00:02:34,360 --> 00:02:40,450 et mønster, hvor vi har parenteser derefter 3 numre så ende parentes 35 00:02:40,450 --> 00:02:44,070 3 flere tal, en bindestreg, 2 numre, og derefter 54. 36 00:02:44,070 --> 00:02:48,310 Og det ville være væsentligt, hvordan vi kommer op med et regulært udtryk for at søge efter det. 37 00:02:49,150 --> 00:02:52,960 >> Så der er - vi har gjort nogle ting i CS50, der er lidt ligesom 38 00:02:52,960 --> 00:02:59,740 regulære udtryk, så - for eksempel - i dictionary.C fil 39 00:02:59,740 --> 00:03:04,720 for stavekontrollen problemet sæt, du kan have brugt fscanf 40 00:03:04,720 --> 00:03:07,930 at læse i et ord fra ordbogen. 41 00:03:07,930 --> 00:03:16,240 Og du kan se den procentvise 45s er på udkig efter en streng på 45 tegn. 42 00:03:16,240 --> 00:03:20,020 Så det er lidt ligesom en rudimentær regulært udtryk. 43 00:03:21,150 --> 00:03:26,060 Og du kan have nogen 45 tegn, der passer regningen derinde 44 00:03:26,060 --> 00:03:28,080 og vælge dem op. 45 00:03:28,080 --> 00:03:33,480 Og så det andet eksempel i den seneste web programmering problem 46 00:03:33,480 --> 00:03:40,760 sat i distro koden til php vi faktisk har en simpel regulært udtryk. 47 00:03:40,760 --> 00:03:46,790 Og dette er simpelthen søger at kontrollere, om den webside, der er gået i 48 00:03:46,790 --> 00:03:51,940 matcher enten login eller logout registrere. PHP. 49 00:03:52,220 --> 00:03:57,910 Og derefter returnere sandt eller falsk baseret på, at regelmæssig udtryk matchning. 50 00:03:59,400 --> 00:04:01,740 >> Så når du bruger regulære udtryk? 51 00:04:01,740 --> 00:04:04,820 Hvorfor er du her i dag? 52 00:04:05,330 --> 00:04:08,480 Så du behøver ikke ønsker at bruge regulære udtryk, når der er noget, der 53 00:04:08,480 --> 00:04:11,640 gør arbejdet for dig endnu mere nemt. 54 00:04:11,640 --> 00:04:15,510 Så XML og HTML er faktisk temmelig tricky 55 00:04:15,510 --> 00:04:18,480 at skrive regulære udtryk, så vi vil se i en lille smule. 56 00:04:19,110 --> 00:04:23,280 Så der er dedikerede parsere for disse sprog. 57 00:04:24,170 --> 00:04:30,060 Du skal også være okay med den handel offs og nøjagtighed ofte. 58 00:04:30,060 --> 00:04:36,220 Hvis du forsøger - så vi oplevede et regulært udtryk for en e-mailadresse, 59 00:04:37,370 --> 00:04:42,590 men siger du ønskede en bestemt e-mail-adresse og efterhånden 60 00:04:42,590 --> 00:04:48,570 regulære udtryk kan blive mere kompliceret, da det blev mere præcis. 61 00:04:49,580 --> 00:04:52,260 Så det ville være en afvejning. 62 00:04:52,260 --> 00:04:55,330 Du er nødt til at være sikker på at du okay gør med det regulære udtryk. 63 00:04:55,330 --> 00:04:57,920 Hvis du ved præcis, hvad du leder efter det måske give mere mening 64 00:04:57,920 --> 00:05:02,070 at sætte i gang og skrive en mere effektiv parser. 65 00:05:02,070 --> 00:05:06,980 Og endelig er der et historisk problem med regelmæssighed 66 00:05:06,980 --> 00:05:08,940 af udtryk og sprog. 67 00:05:08,940 --> 00:05:12,960 Regulære udtryk er faktisk langt mere magtfulde end 68 00:05:12,960 --> 00:05:16,450 regulære udtryk per siger i en formel forstand. 69 00:05:17,130 --> 00:05:20,150 >> Så jeg ønsker ikke at gå for vidt i den formelle teori, 70 00:05:20,150 --> 00:05:24,000 men de fleste sprog, som vi kode i egentlig ikke er regelmæssige. 71 00:05:24,000 --> 00:05:29,110 Og dette er grunden til regulære udtryk undertiden betragtes ikke alt, sikker. 72 00:05:29,670 --> 00:05:33,150 Så dybest set er der en Chomsky hierarki for sprog, 73 00:05:33,150 --> 00:05:38,400 og regulære udtryk er bygget op ved hjælp af union, sammenkædning, 74 00:05:38,400 --> 00:05:41,810 og Kleene stjerne operation, som vi vil se i et par minutter. 75 00:05:43,130 --> 00:05:48,860 Hvis du er interesseret i teorien er der en hel masse i gang der under kølerhjelmen. 76 00:05:50,360 --> 00:05:55,880 >> Så en kort historie - bare for den kontekst her - regelmæssige sæt kom op 77 00:05:55,880 --> 00:05:59,580 i 1950'erne, og derefter vi havde simple redaktører der 78 00:05:59,580 --> 00:06:03,300 indarbejdet regulære udtryk - blot at søge efter strenge. 79 00:06:03,570 --> 00:06:09,110 Grep - som er en kommandolinje værktøj - var en af ​​de første 80 00:06:09,110 --> 00:06:14,160 meget populære værktøjer, der er indarbejdet regulære udtryk i 1960'erne. 81 00:06:14,160 --> 00:06:20,560 I 80'erne blev Perl bygget - er et programmeringssprog, der 82 00:06:20,560 --> 00:06:24,110 inkorporerer regulære udtryk meget fremtrædende plads. 83 00:06:24,550 --> 00:06:30,130 Og så for nylig har vi haft Perl kompatibel regulært udtryk 84 00:06:30,130 --> 00:06:35,870 protokoller dybest set på andre sprog, der bruger meget af den samme syntaks. 85 00:06:36,630 --> 00:06:39,840 Selvfølgelig er den vigtigste begivenhed var i 2008 86 00:06:39,840 --> 00:06:43,040 hvor der var den første nationale Regular Expressions Day, 87 00:06:43,040 --> 00:06:47,350 som jeg mener er 1 juni, hvis du ønsker at fejre det. 88 00:06:48,430 --> 00:06:50,840 >> Igen, bare en lille smule mere teori her. 89 00:06:52,180 --> 00:06:55,320 Så der er et par forskellige måder at konstruere regulære udtryk. 90 00:06:55,950 --> 00:07:02,050 En enkel måde er at bygge det udtryk, du kommer til at 91 00:07:02,050 --> 00:07:07,500 køre på strengen fortolke - grundlæggende bygger en lille mini-program, 92 00:07:07,500 --> 00:07:11,870 vil analysere stykker af en streng og se, "Åh, betyder det passer det regulære udtryk eller ej?" 93 00:07:12,250 --> 00:07:14,250 Og derefter køre det. 94 00:07:14,250 --> 00:07:17,300 Så hvis du har en meget lille regulært udtryk, det er nok 95 00:07:17,300 --> 00:07:19,380 den mest effektive måde at gøre det. 96 00:07:20,090 --> 00:07:25,420 Og så hvis du - en anden mulighed er at holde rekonstruere 97 00:07:25,420 --> 00:07:30,260 udtryk, som du går, og det er simulere mulighed. 98 00:07:30,440 --> 00:07:37,690 Og disse tidlige forsøg på regulære udtryk algoritmer var 99 00:07:37,690 --> 00:07:44,330 relativt simpel og forholdsvis hurtigt, men ikke har en masse fleksibilitet. 100 00:07:44,330 --> 00:07:47,500 Så for at gøre endnu nogle af de ting, som vi kommer til at se på 101 00:07:47,500 --> 00:07:52,860 i dag har vi haft at gøre mere kompleks regulært udtryk 102 00:07:52,860 --> 00:07:56,650 implementeringer, der er potentielt meget langsommere, så det er noget at huske på 103 00:07:57,510 --> 00:08:02,920 Der er også en regelmæssig udtryk fornægtelse af angreb sort 104 00:08:02,920 --> 00:08:08,330 der udnytter potentialet for disse nyere implementeringer af 105 00:08:08,330 --> 00:08:10,930 regulære udtryk til at blive meget kompliceret. 106 00:08:11,570 --> 00:08:15,650 Og på samme måde som vi så i buffer overflow angreb, 107 00:08:15,650 --> 00:08:21,610 du har angreb, der arbejder ved at gøre rekursive sløjfer, 108 00:08:21,610 --> 00:08:24,400 overskridelse kapaciteten af ​​hukommelsen. 109 00:08:24,780 --> 00:08:29,540 Og ved den måde Regexen er et af de officielle flertalsformer af regulære udtryk 110 00:08:29,540 --> 00:08:32,890 analogt på okser i den angelsaksiske. 111 00:08:33,500 --> 00:08:40,169 >> Okay, så Python Library mange af jer her i person have Macs, 112 00:08:40,169 --> 00:08:43,860 så du kan faktisk trække dette op på din skærm. 113 00:08:43,860 --> 00:08:47,480 Regulære udtryk er bygget ind Python. 114 00:08:48,070 --> 00:08:53,020 Og så Python er forudindlæst på Mac-computere og også tilgængelig online på dette link. 115 00:08:53,770 --> 00:08:57,350 Så hvis du ser du kan pause og sørg for at have Python 116 00:08:58,080 --> 00:09:00,170 da vi spiller her. 117 00:09:00,780 --> 00:09:06,420 Der er en manuel online, så hvis du bare skrive Python ind på din computer 118 00:09:06,420 --> 00:09:10,500 vil du se at den version kommer op i terminalen. 119 00:09:11,070 --> 00:09:17,720 Så jeg givet et link til manualen for version 2 af Python samt en bedrager ark. 120 00:09:17,720 --> 00:09:23,100 Der er en version 3 af Python, men din Mac ikke nødvendigvis 121 00:09:23,100 --> 00:09:25,130 kommer med den pågældende forudindlæste. 122 00:09:25,130 --> 00:09:27,360 Så ikke frygtelig anderledes. 123 00:09:27,360 --> 00:09:33,270 Okay, så nogle grundlæggende hjælp af regulære udtryk i Python. 124 00:09:34,080 --> 00:09:42,650 >> Så her jeg brugte en meget enkel udtryk, så jeg gjorde Python import re 125 00:09:43,750 --> 00:09:47,070 og derefter tog resultatet af re.search. 126 00:09:47,070 --> 00:09:49,910 Og søgningen tager 2 argumenter. 127 00:09:49,910 --> 00:09:56,040 Den første er det regulære udtryk, og den anden er den tekst 128 00:09:56,040 --> 00:09:58,290 eller streng, du vil analysere. 129 00:09:58,290 --> 00:10:01,210 Og så vil jeg udskrives ud result.group. 130 00:10:01,580 --> 00:10:05,860 Så disse er de 2 grundlæggende funktioner, vi kommer til at se i dag 131 00:10:06,790 --> 00:10:10,170 i at lære om regulære udtryk. 132 00:10:10,170 --> 00:10:12,880 Så bare nedbryde denne regulære udtryk her 133 00:10:12,880 --> 00:10:21,770 h og derefter \ w og derefter m så \ w bare accepterer enhver bogstav derinde. 134 00:10:21,850 --> 00:10:26,820 Så her er vi på udkig efter en "h", og derefter en anden bogstav 135 00:10:26,820 --> 00:10:30,060 og derefter m, så her, ville matche skinke 136 00:10:30,060 --> 00:10:34,480 i, "Abraham Lincoln og skinke sandwich." 137 00:10:35,040 --> 00:10:37,150 Dette er resultatet af denne gruppe. 138 00:10:37,680 --> 00:10:43,130 En anden ting, som vi kan gøre er at bruge vores før tekststrenge i Python. 139 00:10:43,130 --> 00:10:46,220 Så jeg tror jeg vil gå videre og trække det op her. 140 00:10:46,220 --> 00:10:49,210 Python import re. 141 00:10:50,070 --> 00:10:54,000 Og hvis jeg skulle gøre det samme - lad os sige tekst, 142 00:10:55,390 --> 00:11:00,800 "Abraham," lad os zoome ind - der går vi. 143 00:11:01,610 --> 00:11:06,430 Tekst er "Abraham spiser skinke." 144 00:11:07,460 --> 00:11:15,260 Okay, og derefter føre = re.search. 145 00:11:16,260 --> 00:11:22,020 Og så er vores udtryk kan være h, og så vil jeg gøre dot m.. 146 00:11:22,020 --> 00:11:26,280 Så dot bare tager ethvert tegn, der ikke er en ny linje, herunder tal, 147 00:11:26,280 --> 00:11:28,650 procentpoint skilte, noget lignende. 148 00:11:28,650 --> 00:11:38,030 Og så tekst - boom - og så result.group--ja. 149 00:11:38,030 --> 00:11:41,820 Så det er bare hvordan man gennemfører grundlæggende funktionalitet her. 150 00:11:42,300 --> 00:11:55,110 Hvis vi havde en tekst ring, der - den skøre tekst - inkluderet sige masser af back skråstreger 151 00:11:55,110 --> 00:12:01,180 og strygere inde og ting, der kunne ligne escape-sekvenser, 152 00:12:01,180 --> 00:12:08,480 så vi sandsynligvis vil bruge rå tekst input til at sikre, at der er accepteret. 153 00:12:08,480 --> 00:12:14,120 Og det bare ligner det. 154 00:12:14,120 --> 00:12:17,810 Så hvis vi ledte efter hver af dem derinde skulle vi ikke finde noget. 155 00:12:19,070 --> 00:12:21,680 Men det er hvordan du ville gennemfører den; lige før perlerække af 156 00:12:21,680 --> 00:12:24,990 det regulære udtryk du sætter bogstavet R. 157 00:12:26,150 --> 00:12:30,260 >> Okay, så lad os holde i gang. 158 00:12:30,260 --> 00:12:33,730 Okay - så lad os se på et par gentagne mønstre her. 159 00:12:34,750 --> 00:12:39,150 Så én ting, du ønsker at gøre, er at gentage tingene 160 00:12:40,040 --> 00:12:42,480 som du søger gennem tekst. 161 00:12:42,480 --> 00:12:48,300 Så for at gøre en efterfulgt af et vilkårligt antal b - du gør ab *. 162 00:12:48,630 --> 00:12:51,620 Og så er der en række andre regler også. 163 00:12:51,620 --> 00:12:54,380 Og du kan se alle disse op, jeg vil bare køre gennem nogle af de 164 00:12:54,380 --> 00:12:57,630 mest almindeligt anvendte dem. 165 00:12:57,630 --> 00:13:03,920 Så ab + er en efterfulgt af en N større end 0, hvor b. 166 00:13:04,510 --> 00:13:08,000 AB? er en efterfulgt af 0 eller 1 i b.. 167 00:13:09,190 --> 00:13:18,580 ab {N} er en efterfulgt af N af b, og derefter så videre. 168 00:13:18,580 --> 00:13:22,820 Hvis du har 2 numre i de krøllede parenteser du angiver et interval 169 00:13:23,300 --> 00:13:25,440 der kan være eventuelt matches. 170 00:13:26,390 --> 00:13:30,420 Så vi vil se mere på et par gentagne mønstre i et minut. 171 00:13:31,960 --> 00:13:42,300 Så 2 ting at huske på, når du bruger disse mønstertilpasning redskaber her. 172 00:13:42,300 --> 00:13:52,120 Så siger vi ønsker at se på hm af "Abraham Lincoln gør skinkesandwiches." 173 00:13:52,120 --> 00:13:55,230 Så jeg skiftede Abraham Lincolns navn til Abraham. 174 00:13:55,230 --> 00:14:00,290 Og nu er vi på udkig efter, hvad der er tilbage af denne søgefunktion, 175 00:14:00,290 --> 00:14:03,270 og det kun returnerer skinke i dette tilfælde. 176 00:14:03,620 --> 00:14:08,080 Og det gør det, fordi søgningen bare naturligt tager længst til venstre køen. 177 00:14:08,080 --> 00:14:12,130 Og alle regulære udtryk, medmindre du angiver andet, vil gøre det. 178 00:14:12,830 --> 00:14:18,880 Hvis vi ønskede at finde alle der er en funktion til det - finde alle. 179 00:14:18,880 --> 00:14:35,100 Så bare kunne ligne alle = re.findall ('h.m', text) 180 00:14:35,100 --> 00:14:44,540 og derefter all.group (). 181 00:14:44,540 --> 00:14:51,040 Alle producerer både skinke og skinke, i dette tilfælde begge strenge i Abraham hver skinke. 182 00:14:51,610 --> 00:14:55,110 Så det er en anden mulighed. 183 00:14:56,250 --> 00:15:06,940 >> Great. Den anden ting at huske på er, at regulære udtryk tager den største intuitivt. 184 00:15:06,940 --> 00:15:09,520 Lad os se på dette eksempel. 185 00:15:10,200 --> 00:15:16,070 Vi gjorde det længst til venstre søgning her, og så forsøgte jeg en større søgning 186 00:15:16,070 --> 00:15:18,800 bruger Kleene stjerne operatør. 187 00:15:18,800 --> 00:15:24,180 Så for "Abraham Lincoln gør skinkesandwiches", og jeg fik kun tilbage 188 00:15:24,180 --> 00:15:26,280 m som resultat. 189 00:15:26,280 --> 00:15:31,670 Årsagen til denne fejl var, at jeg kunne have taget en række 190 00:15:31,670 --> 00:15:36,140 h er fordi jeg ikke angav noget at gå i mellem h og m. 191 00:15:36,140 --> 00:15:42,010 Det eneste eksempel der, havde m - de eneste eksempler der med m i det 192 00:15:42,010 --> 00:15:46,220 og et antal timer s var bare strengen m.. 193 00:15:46,490 --> 00:15:51,850 Så jeg prøvede det igen, sagde jeg: "Okay, lad os få den faktiske største gruppe her." 194 00:15:51,850 --> 00:15:59,670 Og så gjorde jeg h. * M, så der bare returnerer vilkårligt antal tegn mellem h og m. 195 00:16:00,280 --> 00:16:02,950 Og hvis du lige er startet ud og tænker, "Åh, vil okay, godt denne 196 00:16:02,950 --> 00:16:11,560 få mig skinke, "det faktisk tager alt fra h i Abraham Lincoln 197 00:16:11,560 --> 00:16:13,690 hele vejen op til slutningen af ​​skinke. 198 00:16:14,040 --> 00:16:18,110 Det er grådige, det ser h - alt dette andet tekst - m, 199 00:16:18,110 --> 00:16:21,280 og det er, hvad det tager i. 200 00:16:22,060 --> 00:16:27,480 Dette er et særligt grove - dette er en funktion, som vi kan også 201 00:16:27,480 --> 00:16:30,670 angiver for det ikke være grådig hjælp af andre funktioner. 202 00:16:31,480 --> 00:16:34,490 Men det er noget, vi er nødt til at huske på, især 203 00:16:34,490 --> 00:16:38,720 når man ser på HTML-teksten, der er en grund til, at 204 00:16:38,720 --> 00:16:41,500 regulære udtryk er svære for HTML. 205 00:16:42,460 --> 00:16:46,310 Fordi hvis du har en HTML åbent tag, og derefter masser af ting i midten 206 00:16:46,310 --> 00:16:49,820 og derefter nogle andre HTML lukket tag langt senere i programmet, 207 00:16:49,820 --> 00:16:55,420 du lige har spist en masse af din HTML-kode eventuelt ved en fejltagelse. 208 00:16:56,200 --> 00:17:01,840 >> Okay - så mere specialtegn, ligesom mange andre sprog, 209 00:17:01,840 --> 00:17:04,780 vi undslippe bruger skråstreg. 210 00:17:04,780 --> 00:17:10,329 Så vi kan bruge dot til at angive alle tegn bortset fra en ny linje. 211 00:17:10,329 --> 00:17:14,550 Vi kan bruge flugt w for at angive eventuelle bogstav. 212 00:17:14,550 --> 00:17:20,329 Og analogt escape d for enhver heltal - numerisk karakter. 213 00:17:20,630 --> 00:17:27,440 Vi kan angive - vi kan bruge parenteser til at angive relaterede udtryk. 214 00:17:27,440 --> 00:17:30,970 Så det ville acceptere a, b, eller c.. 215 00:17:31,320 --> 00:17:37,000 Og vi kan også angive eller muligheder for enten a eller b. 216 00:17:37,000 --> 00:17:41,110 For eksempel - hvis vi var på udkig efter flere muligheder 217 00:17:41,110 --> 00:17:44,940 i parentes vi kunne bruge eller operatøren i - 218 00:17:44,940 --> 00:17:52,480 så lad os gå tilbage til dette eksempel her. 219 00:17:53,000 --> 00:17:59,790 Og lad os nu tage - lad os gå tilbage til dette eksempel her, og derefter 220 00:17:59,790 --> 00:18:12,290 tage ae - så det skal returnere - Jeg tror det er stadig Abraham. 221 00:18:12,290 --> 00:18:17,410 Så dette - hvis vi gør alt - store. 222 00:18:17,410 --> 00:18:22,700 Så lad os ajourføre teksten her. 223 00:18:22,700 --> 00:18:34,690 "Abraham spiser skinke, mens Hemming hans -. Mens Hemming" Great. 224 00:18:44,090 --> 00:18:47,330 All. Great. Nu får vi skinke, skinke, og forneden. 225 00:18:48,510 --> 00:18:59,370 Mens Hemming - mens nynne for ham - mens nynne til søm ham. Great. 226 00:19:00,350 --> 00:19:03,250 Samme ting. 227 00:19:03,820 --> 00:19:09,180 Nu er alt tilbage stadig bare skinke, skinke og hem uden at løfte på brummen eller ham. 228 00:19:09,940 --> 00:19:22,600 Great - så hvad nu hvis vi ønskede at se på, enten at - så vi kunne også gøre 229 00:19:23,510 --> 00:19:33,810 ham eller - vi vil vende tilbage til. 230 00:19:34,810 --> 00:19:45,760 Okay - så - okay - i stillinger, du kan også bruge karet eller dollartegn 231 00:19:45,760 --> 00:19:49,350 at angive, at du er på udkig efter noget i starten eller slutningen af ​​en streng. 232 00:19:50,260 --> 00:19:52,260 Eller i starten eller slutningen af ​​et ord. 233 00:19:52,400 --> 00:19:54,470 Det er en måde at bruge det. 234 00:19:55,630 --> 00:20:01,160 >> Okay - så lad os lege med en lidt større blok af tekst. 235 00:20:03,950 --> 00:20:08,310 Lad os sige denne række her - dette udsagn her. 236 00:20:08,310 --> 00:20:11,360 Den effekt af regulære udtryk er, at de kan angive mønstre 237 00:20:11,360 --> 00:20:13,390 ikke bare fast tegn. 238 00:20:14,900 --> 00:20:18,790 Lad os gøre - lad os kalde denne blok. 239 00:20:22,400 --> 00:20:27,110 Så vil vi læse alt dette i. 240 00:20:28,890 --> 00:20:50,820 Og derefter har en - lad os gøre alle =, og så hvad er nogle ting, vi kunne søge ind her rentabelt? 241 00:20:50,820 --> 00:20:54,070 Vi kunne kigge efter udtrykket øre. 242 00:20:55,050 --> 00:21:01,520 Ikke meget interessant. Hvad med det? Vi vil se, hvad der sker. 243 00:21:03,710 --> 00:21:05,710 Jeg gav det et problem. 244 00:21:06,380 --> 00:21:10,750 Så en række ting, før man igen og alle. 245 00:21:10,750 --> 00:21:15,630 Så det skal returnere alt fra begyndelsen op til alle re måske et par gange. 246 00:21:18,800 --> 00:21:21,970 Og så har vi her magt regulære udtryk er, at de 247 00:21:21,970 --> 00:21:24,900 kan angive mønstre ikke bare tegn her er. 248 00:21:24,900 --> 00:21:28,510 Så hele vejen op til den endelige re, det startede med den venstre mest og var grådige. 249 00:21:30,710 --> 00:21:32,710 Lad os se, - hvad andet kunne vi kigge efter. 250 00:21:32,710 --> 00:21:39,860 Jeg gætter én ting, hvis du var interesseret i at lede efter de pronominer hun og han, 251 00:21:39,860 --> 00:21:44,600 kan du kontrollere, om s er lig med 0 eller 1 252 00:21:44,600 --> 00:21:49,710 og udtrykket han, og det er sandsynligvis ikke kommer til at vende tilbage - 253 00:21:49,710 --> 00:21:58,020 åh, jeg tror det returnerede han, fordi der vi ser på magten, den dag, der er her. 254 00:22:00,590 --> 00:22:06,270 Lad os prøve det præciseres, at dette har til at komme i starten af ​​noget. 255 00:22:06,640 --> 00:22:09,530 Lad os se, om det falder ud. 256 00:22:09,530 --> 00:22:19,630 Så vi kan gøre fedt, og der får vi ikke noget, fordi hun og han 257 00:22:19,630 --> 00:22:22,870 forekommer ikke i denne sætning. 258 00:22:24,960 --> 00:22:30,410 Great. Okay - så tilbage til katten her. 259 00:22:30,410 --> 00:22:35,720 Så komplekse mønstre er såre hjernen. 260 00:22:35,720 --> 00:22:40,500 Så det er derfor, vi bruger regulære udtryk til at undgå disse problemer. 261 00:22:40,820 --> 00:22:43,520 >> Så her er nogle andre nyttige funktioner, du kan lege med. 262 00:22:43,520 --> 00:22:50,290 Vi kiggede på søgning i dag, men du kan også bruge match, split, findall og grupper. 263 00:22:50,290 --> 00:22:53,970 Så andre seje ting, du kan gøre med regulære udtryk udover bare 264 00:22:53,970 --> 00:22:58,870 udkig efter mønstre tager et mønster og holde alle kampene - 265 00:22:58,870 --> 00:23:02,530 dens variabler - og så bruge dem i din kode senere. 266 00:23:02,850 --> 00:23:05,980 Det kan være ganske nyttigt. Andre ting kunne være at tælle. 267 00:23:05,980 --> 00:23:11,720 Så vi kan tælle antallet af forekomster af et regulært udtryk mønster, 268 00:23:11,720 --> 00:23:13,960 og det er, hvad vi kan bruge grupper til. 269 00:23:13,960 --> 00:23:17,550 Og andre transportformer samt er også mulige. 270 00:23:18,040 --> 00:23:22,980 Så jeg vil bare tale lidt mere om andre måder, du kan bruge regulære udtryk. 271 00:23:22,980 --> 00:23:29,100 >> Så en mere avanceret anvendelse er i fuzzy matching. 272 00:23:29,100 --> 00:23:33,450 Så hvis du er på udkig efter en tekst til udtrykket, Julius Cæsar, 273 00:23:33,450 --> 00:23:37,740 og du kan se enten Gaius Julius Cæsar eller navnet Julius Cæsar i andre sprog, 274 00:23:37,740 --> 00:23:44,400 så skal du måske også ønsker at tildele en vis vægt på disse værdier. 275 00:23:44,400 --> 00:23:48,930 Og hvis det er tæt nok - hvis den krydser en vis tærskel - så du ønsker 276 00:23:48,930 --> 00:23:50,860 at være i stand til at acceptere Julius Cæsar. 277 00:23:50,860 --> 00:24:00,580 Så der er et par forskellige implementeringer for at i et par andre sprog så godt. 278 00:24:02,580 --> 00:24:08,420 Her er nogle andre værktøjer, Regex Pal - en handy lille app online for at 279 00:24:08,420 --> 00:24:12,190 kontrollere, om dine regulære udtryk er sammensat korrekt. 280 00:24:12,190 --> 00:24:18,500 Der er også enkeltstående værktøjer, som du kan køre fra skrivebordet 281 00:24:18,500 --> 00:24:22,100 Ligesom Ultra Pico, og så godt som bare kogebøger. 282 00:24:22,100 --> 00:24:25,410 Så hvis du laver et projekt, der involverer et væld af regulære udtryk 283 00:24:25,410 --> 00:24:29,810 dette er sandsynligvis stedet at gå uden for i dag. 284 00:24:31,520 --> 00:24:35,770 Og så bare for at give dig en fornemmelse af, hvor almindeligt det er 285 00:24:35,770 --> 00:24:44,090 Der er grep i Unix, Perl har indbygget, og C er der PCRE for C. 286 00:24:44,090 --> 00:24:48,890 Og så alle disse andre sprog har også regulære udtryk pakker 287 00:24:48,890 --> 00:24:52,020 der opererer med væsentligt samme syntaks, vi fik en smag af i dag. 288 00:24:52,020 --> 00:24:54,790 PHP, Java, Ruby, og så videre. 289 00:24:56,080 --> 00:24:58,980 >> Google Code Search er faktisk værd at nævne, det er et af de 290 00:24:58,980 --> 00:25:05,720 relativt få programmer derude, der giver offentligheden adgang 291 00:25:05,720 --> 00:25:07,800 sin database ved hjælp af regulære udtryk. 292 00:25:07,800 --> 00:25:12,920 Så hvis man ser på Google Code Search kan du finde koden 293 00:25:12,920 --> 00:25:16,880 Hvis du er på udkig efter en instans af, hvordan en funktion kan anvendes, 294 00:25:16,880 --> 00:25:21,610 kan du bruge et regulært udtryk til at finde denne funktion bliver brugt i alle mulige forskellige sager. 295 00:25:21,610 --> 00:25:28,000 Du kan kigge efter fwrite, og så kunne du kigge efter flag skrive eller læse 296 00:25:28,000 --> 00:25:32,000 hvis du ønsker et eksempel på fwrite bliver brugt i denne sag. 297 00:25:33,530 --> 00:25:37,010 Så den samme ting der, og her er nogle referencer. 298 00:25:37,010 --> 00:25:40,990 Dette vil være tilgængelige online så godt, så går fremad, hvis 299 00:25:40,990 --> 00:25:45,560 du ønsker at se på Python, grep, Perl - du blot ønsker at få lidt inspiration 300 00:25:45,560 --> 00:25:50,650 eller hvis du ønsker at se mere på teorien her er nogle god hoppe fra steder. 301 00:25:50,650 --> 00:25:53,870 Mange tak. 302 00:25:58,470 --> 00:25:59,910 [CS50.TV]