1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Seminar: Het matchen met Regular Expressions] 2 00:00:02,000 --> 00:00:04,000 [John Mussman-Harvard University] 3 00:00:04,000 --> 00:00:07,220 [Dit is CS50.-CS50.TV] 4 00:00:07,780 --> 00:00:11,610 Oke. Nou, welkom iedereen. Dit is CS50 2012. 5 00:00:11,780 --> 00:00:16,610 Mijn naam is John, en ik zal praten vandaag over reguliere expressies. 6 00:00:16,610 --> 00:00:22,530 Reguliere expressies is voornamelijk een hulpmiddel, maar soms ook gebruikt 7 00:00:22,530 --> 00:00:28,650 in code actief te wezen overeenkomen patronen en strijkers. 8 00:00:28,650 --> 00:00:33,800 Dus hier is een web comic van xkcd. 9 00:00:34,440 --> 00:00:42,370 In deze strip is er een moord mysterie waar de moordenaar heeft 10 00:00:42,370 --> 00:00:47,860 volgde iemand op vakantie, en de protagonisten moeten 11 00:00:47,860 --> 00:00:52,500 zoeken in 200 megabyte aan e-mails op zoek naar een adres. 12 00:00:52,500 --> 00:00:56,090 En ze over te geven als iemand die reguliere expressies weet - 13 00:00:56,090 --> 00:01:00,550 vermoedelijk een superheld - swoops naar beneden en schrijft wat code 14 00:01:00,550 --> 00:01:02,970 en lost het moordmysterie. 15 00:01:02,970 --> 00:01:07,370 Dus vermoedelijk dat zal iets zijn dat je wordt gemachtigd zijn om te doen 16 00:01:07,370 --> 00:01:09,370 Na dit seminar. 17 00:01:09,370 --> 00:01:12,250 We gaan gewoon een beknopte inleiding te geven in de taal 18 00:01:12,250 --> 00:01:16,770 en geven u voldoende middelen om te gaan na meer middelen op uw eigen. 19 00:01:17,680 --> 00:01:21,700 >> Dus reguliere expressies lijken in principe net als dit. 20 00:01:22,930 --> 00:01:25,550 Dit is een reguliere expressie in Ruby. 21 00:01:25,550 --> 00:01:29,280 Het is niet erg verschillend over talen. 22 00:01:29,690 --> 00:01:37,630 We moeten gewoon op slashes te beginnen en markeer de reguliere expressie in Ruby. 23 00:01:37,630 --> 00:01:42,880 En dit is een reguliere expressie te zoeken in e-mailadres patroon. 24 00:01:42,880 --> 00:01:49,160 Zo zien we in de eerste bit ziet er voor een alfanumeriek teken. 25 00:01:50,500 --> 00:01:54,880 Dat komt omdat e-mailadressen moeten vaak beginnen met een letterteken. 26 00:01:55,460 --> 00:01:59,330 En dan geen speciale teken, gevolgd door het @-symbool. 27 00:01:59,330 --> 00:02:03,260 En dan hetzelfde voor domeinnaam. 28 00:02:03,260 --> 00:02:10,030 En dan tussen de 2 en 4 karakters om te zoeken naar het. Com,. Net, en ga zo maar door. 29 00:02:10,850 --> 00:02:13,200 Dus dat is een ander voorbeeld van de reguliere expressie. 30 00:02:13,200 --> 00:02:17,270 Dus reguliere expressies zijn protocollen voor het ontdekken van patronen in de tekst. 31 00:02:17,270 --> 00:02:21,130 Ze doen vergelijkingen, selecties, en vervangingen. 32 00:02:21,690 --> 00:02:27,970 Dus een derde voorbeeld is het vinden van alle telefoonnummers eindigend in 54 in een directory. 33 00:02:27,970 --> 00:02:34,360 Dus voordat David scheurt de CS50 directory we konden zoeken 34 00:02:34,360 --> 00:02:40,450 een patroon waar we haakjes dan 3 nummers eindigen dan haakjes, 35 00:02:40,450 --> 00:02:44,070 3 meer nummers, een streepje, 2 cijfers, en daarna 54. 36 00:02:44,070 --> 00:02:48,310 En dat zou in wezen zijn hoe we komen met een reguliere expressie om te zoeken naar dat. 37 00:02:49,150 --> 00:02:52,960 >> Dus er zijn - we hebben een aantal dingen gedaan in CS50 die zijn een beetje zoals 38 00:02:52,960 --> 00:02:59,740 reguliere expressies, dus - bijvoorbeeld - in het dictionary.C bestand 39 00:02:59,740 --> 00:03:04,720 voor de spellingcontrole probleem set u heeft gebruikt fscanf 40 00:03:04,720 --> 00:03:07,930 te lezen in een woord uit het woordenboek. 41 00:03:07,930 --> 00:03:16,240 En je kunt zien is het percentage 45s is op zoek naar een string van 45 tekens. 42 00:03:16,240 --> 00:03:20,020 Dus het is een beetje zoals een rudimentaire reguliere expressie. 43 00:03:21,150 --> 00:03:26,060 En u kunt elk 45 tekens dat het wetsvoorstel past in daar hebben 44 00:03:26,060 --> 00:03:28,080 en pak deze op. 45 00:03:28,080 --> 00:03:33,480 En dan het tweede voorbeeld in de meest recente web programmeren probleem 46 00:03:33,480 --> 00:03:40,760 in de distro code voor php we eigenlijk wel een eenvoudige reguliere expressie. 47 00:03:40,760 --> 00:03:46,790 En deze is gewoon op zoek om te controleren of de webpagina die wordt doorgegeven in 48 00:03:46,790 --> 00:03:51,940 overeenkomt ofwel inloggen of uitloggen registreren. PHP. 49 00:03:52,220 --> 00:03:57,910 En vervolgens terug te keren waar of onwaar zijn gebaseerd op die reguliere expressies voor zoeken. 50 00:03:59,400 --> 00:04:01,740 >> Dus als je reguliere expressie gebruiken? 51 00:04:01,740 --> 00:04:04,820 Waarom ben je hier vandaag? 52 00:04:05,330 --> 00:04:08,480 Dus je wilt niet reguliere expressie gebruiken wanneer er iets dat 53 00:04:08,480 --> 00:04:11,640 doet het werk voor u nog makkelijker. 54 00:04:11,640 --> 00:04:15,510 Dus XML en HTML zijn eigenlijk behoorlijk lastig 55 00:04:15,510 --> 00:04:18,480 schrijven van reguliere expressies voor zoals we zullen zien in een klein beetje. 56 00:04:19,110 --> 00:04:23,280 Dus er zijn speciale parsers voor die talen. 57 00:04:24,170 --> 00:04:30,060 Je moet ook goed met de trade offs en nauwkeurigheid te vaak. 58 00:04:30,060 --> 00:04:36,220 Als je probeert - zo zagen we een reguliere expressie voor een e-mailadres, 59 00:04:37,370 --> 00:04:42,590 maar zeggen dat je wilde een specifiek e-mailadres en geleidelijk aan de 60 00:04:42,590 --> 00:04:48,570 reguliere expressie wellicht complexer geworden als het werd nauwkeuriger. 61 00:04:49,580 --> 00:04:52,260 Zodat men de handel af zou zijn. 62 00:04:52,260 --> 00:04:55,330 Je moet er zeker van zijn dat u in orde maken met de reguliere expressie. 63 00:04:55,330 --> 00:04:57,920 Als je precies weet wat je zoekt is het misschien zinvoller 64 00:04:57,920 --> 00:05:02,070 te zetten in de tijd en schrijf een meer effectieve parser. 65 00:05:02,070 --> 00:05:06,980 En ten slotte is er een historisch probleem met de regelmaat 66 00:05:06,980 --> 00:05:08,940 van uitdrukkingen en talen. 67 00:05:08,940 --> 00:05:12,960 Reguliere expressies zijn eigenlijk veel krachtiger dan 68 00:05:12,960 --> 00:05:16,450 reguliere expressies per zeggen in formele zin. 69 00:05:17,130 --> 00:05:20,150 >> Dus ik wil niet te ver te gaan in de formele theorie, 70 00:05:20,150 --> 00:05:24,000 maar de meeste talen die code in feite zijn we niet regelmatig. 71 00:05:24,000 --> 00:05:29,110 En dit is waarom reguliere expressies soms niet worden beschouwd dat alles veilig is. 72 00:05:29,670 --> 00:05:33,150 Dus eigenlijk is er een Chomsky hiërarchie voor talen, 73 00:05:33,150 --> 00:05:38,400 en reguliere expressies worden opgebouwd met behulp unie, aaneenschakeling, 74 00:05:38,400 --> 00:05:41,810 en de Kleene ster operatie die we zullen zien in een paar minuten. 75 00:05:43,130 --> 00:05:48,860 Als u geïnteresseerd bent in theorie is er heel veel gebeurt er onder de motorkap. 76 00:05:50,360 --> 00:05:55,880 >> Dus een korte geschiedenis - alleen voor de context hier - reguliere sets kwam 77 00:05:55,880 --> 00:05:59,580 in de jaren 1950, en toen moesten we eenvoudige editors die 78 00:05:59,580 --> 00:06:03,300 opgenomen reguliere expressies - alleen het zoeken naar strings. 79 00:06:03,570 --> 00:06:09,110 Grep - dat is een command-line tool - was een van de eerste 80 00:06:09,110 --> 00:06:14,160 zeer populaire tools die opgenomen reguliere expressies in de jaren 1960. 81 00:06:14,160 --> 00:06:20,560 In de jaren '80, werd Perl gebouwd - is een programmeertaal die 82 00:06:20,560 --> 00:06:24,110 bevat reguliere expressies erg prominent. 83 00:06:24,550 --> 00:06:30,130 En dan meer recent hebben we Perl compatible reguliere expressie had 84 00:06:30,130 --> 00:06:35,870 protocollen principe in andere talen die veel van dezelfde syntax. 85 00:06:36,630 --> 00:06:39,840 Natuurlijk is de belangrijkste gebeurtenis was in 2008 86 00:06:39,840 --> 00:06:43,040 waar was de eerste Nationale Regular Expressions Dag, 87 00:06:43,040 --> 00:06:47,350 waarvan ik denk dat is 1 juni als u wilt vieren dat. 88 00:06:48,430 --> 00:06:50,840 >> Nogmaals, net een beetje meer theorie hier. 89 00:06:52,180 --> 00:06:55,320 Dus er zijn een paar verschillende manieren om het maken van reguliere expressies. 90 00:06:55,950 --> 00:07:02,050 Een eenvoudige manier is om de expressie te bouwen die je gaat 91 00:07:02,050 --> 00:07:07,500 draaien op de snaar te interpreteren - in principe de bouw van een kleine mini-programma dat 92 00:07:07,500 --> 00:07:11,870 analyseert stukjes van een string en zie, "Oh, doet dit aan de reguliere expressie of niet? ' 93 00:07:12,250 --> 00:07:14,250 En dan lopen die. 94 00:07:14,250 --> 00:07:17,300 Dus als u een zeer kleine reguliere expressie, dit is waarschijnlijk 95 00:07:17,300 --> 00:07:19,380 de meest efficiënte manier om het te doen. 96 00:07:20,090 --> 00:07:25,420 En dan als je - een andere optie is om te blijven reconstructie van de 97 00:07:25,420 --> 00:07:30,260 expressie als je gaat, en dat is het simuleren mogelijkheid. 98 00:07:30,440 --> 00:07:37,690 En deze vroege pogingen tot reguliere algoritmes expressie waren 99 00:07:37,690 --> 00:07:44,330 relatief eenvoudig en relatief snel, maar had niet veel flexibiliteit. 100 00:07:44,330 --> 00:07:47,500 Dus om zelfs sommige van de dingen die we gaan kijken naar 101 00:07:47,500 --> 00:07:52,860 vandaag hebben we moesten meer complexe reguliere expressie doen 102 00:07:52,860 --> 00:07:56,650 implementaties die potentieel veel langzamer, dus dat is iets om in gedachten te houden 103 00:07:57,510 --> 00:08:02,920 Er is ook een reguliere expressies ontkenning van aanval variëteit 104 00:08:02,920 --> 00:08:08,330 dat het potentieel voor deze nieuwere implementaties van exploiteren 105 00:08:08,330 --> 00:08:10,930 reguliere expressies tot zeer complex geworden. 106 00:08:11,570 --> 00:08:15,650 En in vrijwel dezelfde zin dat we in buffer overflow-aanvallen zag, 107 00:08:15,650 --> 00:08:21,610 je moet aanvallen die werken door het maken van recursieve lussen die 108 00:08:21,610 --> 00:08:24,400 een overschrijding van de capaciteit van het geheugen. 109 00:08:24,780 --> 00:08:29,540 En trouwens Regexen is een van de officiële meervouden van reguliere expressie 110 00:08:29,540 --> 00:08:32,890 naar analogie van ossen in de Angelsaksische. 111 00:08:33,500 --> 00:08:40,169 >> Oke, dus de Python Library velen van u hier in persoon hebben Macs, 112 00:08:40,169 --> 00:08:43,860 dus je kunt eigenlijk trekt dit op uw scherm. 113 00:08:43,860 --> 00:08:47,480 Reguliere expressies zijn ingebouwd in Python. 114 00:08:48,070 --> 00:08:53,020 En zo Python is voorgeladen op Macs en ook online beschikbaar op deze link. 115 00:08:53,770 --> 00:08:57,350 Dus als je je in de gaten kunt pauzeren en zorg ervoor dat je Python 116 00:08:58,080 --> 00:09:00,170 als we spelen hier rond. 117 00:09:00,780 --> 00:09:06,420 Er is een handleiding online, dus als je typt gewoon Python in uw computer 118 00:09:06,420 --> 00:09:10,500 je zult zien dat de versie komt in de terminal. 119 00:09:11,070 --> 00:09:17,720 Dus heb ik een link naar de handleiding voor versie 2 van Python, evenals een spiekbriefje. 120 00:09:17,720 --> 00:09:23,100 Er is een versie 3 van Python, maar uw Mac niet noodzakelijkerwijs 121 00:09:23,100 --> 00:09:25,130 komen met die voorgeladen. 122 00:09:25,130 --> 00:09:27,360 Dus niet erg verschillend. 123 00:09:27,360 --> 00:09:33,270 Oke, dus een aantal basisprincipes van het gebruik van reguliere expressies in Python. 124 00:09:34,080 --> 00:09:42,650 >> Dus hier heb ik een heel eenvoudige uitdrukking, dus ik deed Python import re 125 00:09:43,750 --> 00:09:47,070 en nam toen het resultaat van re.search. 126 00:09:47,070 --> 00:09:49,910 En de zoektocht duurt 2 argumenten. 127 00:09:49,910 --> 00:09:56,040 De eerste is de reguliere expressie, en de tweede is de tekst 128 00:09:56,040 --> 00:09:58,290 of tekenreeks die u wilt analyseren. 129 00:09:58,290 --> 00:10:01,210 En vervolgens afgedrukt ik uit de result.group. 130 00:10:01,580 --> 00:10:05,860 Dus dit zijn de 2 basisfuncties gaan we vandaag te zien 131 00:10:06,790 --> 00:10:10,170 in het leren over reguliere expressies. 132 00:10:10,170 --> 00:10:12,880 Dus gewoon afbreken van deze reguliere expressie hier 133 00:10:12,880 --> 00:10:21,770 h en vervolgens \ w en vervolgens op m zo \ w accepteert zomaar een letter uit het alfabet in. 134 00:10:21,850 --> 00:10:26,820 Dus hier zijn we op zoek naar een "h" en dan nog een letter uit het alfabet 135 00:10:26,820 --> 00:10:30,060 en dan m, dus even dat zou overeenkomen met ham 136 00:10:30,060 --> 00:10:34,480 in, "Abraham Lincoln en ham broodjes." 137 00:10:35,040 --> 00:10:37,150 Dit is het gevolg van die groep. 138 00:10:37,680 --> 00:10:43,130 Een ander ding dat we kunnen doen is gebruik maken van ons vóór snaren van tekst in Python. 139 00:10:43,130 --> 00:10:46,220 Dus ik denk dat ik zal doorgaan en trek die omhoog hier. 140 00:10:46,220 --> 00:10:49,210 Python import re. 141 00:10:50,070 --> 00:10:54,000 En als ik hetzelfde doen - laten we zeggen tekst is, 142 00:10:55,390 --> 00:11:00,800 "Abraham," laat ons in te zoomen - daar gaan we. 143 00:11:01,610 --> 00:11:06,430 De tekst is: "Abraham eet ham." 144 00:11:07,460 --> 00:11:15,260 Oke, en dan resulteren = re.search. 145 00:11:16,260 --> 00:11:22,020 En dan is onze expressie kan worden h, en dan zal ik de dot m doen. 146 00:11:22,020 --> 00:11:26,280 Dus dot duurt slechts een teken dat geen een nieuwe lijn, waaronder nummers, 147 00:11:26,280 --> 00:11:28,650 percentage tekenen, iets dergelijks. 148 00:11:28,650 --> 00:11:38,030 En dan tekst - boom - en vervolgens result.group--ja. 149 00:11:38,030 --> 00:11:41,820 Dus dat is gewoon hoe je hier implementeren basisfunctionaliteit. 150 00:11:42,300 --> 00:11:55,110 Als we een tekst ring die - dat gekke tekst - Inclusief zeggen veel backslashes 151 00:11:55,110 --> 00:12:01,180 en strijkers binnen en dingen die er zou kunnen uitzien escape sequences, 152 00:12:01,180 --> 00:12:08,480 dan zijn we waarschijnlijk willen de ruwe tekstinvoer gebruiken om ervoor te zorgen dat wordt geaccepteerd. 153 00:12:08,480 --> 00:12:14,120 En dat ziet er gewoon zo. 154 00:12:14,120 --> 00:12:17,810 Dus als we zochten elk van hen daar moeten we niets vinden. 155 00:12:19,070 --> 00:12:21,680 Maar dat is hoe je het zou voeren; net voor de string van 156 00:12:21,680 --> 00:12:24,990 de reguliere expressie die u de letter r gezet. 157 00:12:26,150 --> 00:12:30,260 >> Oke, dus laten we blijven gaan. 158 00:12:30,260 --> 00:12:33,730 Oke - dus laten we eens kijken naar een paar herhalende patronen hier. 159 00:12:34,750 --> 00:12:39,150 Dus een ding dat je wilt doen is herhalen dingen 160 00:12:40,040 --> 00:12:42,480 als u op zoek bent via tekst. 161 00:12:42,480 --> 00:12:48,300 Dus om te doen een gevolgd door een willekeurig aantal b - je doet ab *. 162 00:12:48,630 --> 00:12:51,620 En dan zijn er nog een reeks andere regels ook. 163 00:12:51,620 --> 00:12:54,380 En u kunt al deze omhoog te kijken, ik zal gewoon lopen door een aantal van de 164 00:12:54,380 --> 00:12:57,630 meest gebruikte degenen. 165 00:12:57,630 --> 00:13:03,920 Dus ab + is een, gevolgd door een N groter dan 0 of b. 166 00:13:04,510 --> 00:13:08,000 ab? is gevolgd door 0 of 1 b. 167 00:13:09,190 --> 00:13:18,580 ab {N} is een gevolgd door N van b, en dan zo verder. 168 00:13:18,580 --> 00:13:22,820 Als je 2 nummers in de accolades u een bereik 169 00:13:23,300 --> 00:13:25,440 dat kan eventueel aangepast. 170 00:13:26,390 --> 00:13:30,420 Dus zullen we meer kijken naar een paar herhalende patronen in een minuut. 171 00:13:31,960 --> 00:13:42,300 Dus 2 dingen in gedachten te houden bij het gebruik van deze pattern matching gereedschappen hier. 172 00:13:42,300 --> 00:13:52,120 Dus zeggen dat we willen kijken naar de hm van, "Abraham Lincoln maakt ham sandwiches." 173 00:13:52,120 --> 00:13:55,230 Dus ik veranderde de naam van Abraham Lincoln aan Abraham. 174 00:13:55,230 --> 00:14:00,290 En nu zijn we op zoek naar wat wordt geretourneerd door deze zoekfunctie, 175 00:14:00,290 --> 00:14:03,270 en dat het alleen resultaten ham in dit geval. 176 00:14:03,620 --> 00:14:08,080 En het doet dat omdat search gewoon van nature neemt de meest linkse wachtrij. 177 00:14:08,080 --> 00:14:12,130 En alle reguliere expressies, tenzij u anders opgeeft zal dat doen. 178 00:14:12,830 --> 00:14:18,880 Als we wilden allemaal vinden is er een functie voor die - allemaal vinden. 179 00:14:18,880 --> 00:14:35,100 Dus dat kon gewoon uitzien als alle = re.findall ('h.m', tekst) 180 00:14:35,100 --> 00:14:44,540 en dan all.group (). 181 00:14:44,540 --> 00:14:51,040 Alle produceert zowel ham en ham, in dit geval zowel van de snaren in Abraham elke ham. 182 00:14:51,610 --> 00:14:55,110 Dat is precies een optie. 183 00:14:56,250 --> 00:15:06,940 >> Geweldig. Het andere ding om in gedachten te houden is dat reguliere expressies nemen het grootste intuïtief. 184 00:15:06,940 --> 00:15:09,520 Laten we eens kijken naar dit voorbeeld. 185 00:15:10,200 --> 00:15:16,070 Wij deden dat meest linkse zoeken hier, en toen probeerde ik een grotere zoekopdracht 186 00:15:16,070 --> 00:15:18,800 met behulp van de Kleene ster operator. 187 00:15:18,800 --> 00:15:24,180 Dus voor, "Abraham Lincoln maakt broodjes ham," en ik alleen terug 188 00:15:24,180 --> 00:15:26,280 m als gevolg. 189 00:15:26,280 --> 00:15:31,670 De reden voor die fout was dat ik een aantal van had kunnen nemen 190 00:15:31,670 --> 00:15:36,140 h is omdat ik niet iets te gaan tussen h en m te geven. 191 00:15:36,140 --> 00:15:42,010 Het enige voorbeeld dat er m had - de enige voorbeelden daar met m erin 192 00:15:42,010 --> 00:15:46,220 en een willekeurig aantal uur waren alleen de snaarmhoge. 193 00:15:46,490 --> 00:15:51,850 Daarna probeerde ik het opnieuw, ik zei: 'Oke, laten we hier de werkelijke grootste groep. " 194 00:15:51,850 --> 00:15:59,670 En toen deed ik h. * M, zodat die net terugkeert willekeurig aantal tekens tussen h en m. 195 00:16:00,280 --> 00:16:02,950 En als je net begint en denken, "Oh, oke, ook dit zal 196 00:16:02,950 --> 00:16:11,560 Begrijp me ham, "het duurt eigenlijk alles van de h in Abraham Lincoln 197 00:16:11,560 --> 00:16:13,690 helemaal tot aan het einde van de ham. 198 00:16:14,040 --> 00:16:18,110 Het is hebzuchtig, het ziet h - al deze andere tekst - m, 199 00:16:18,110 --> 00:16:21,280 en dat is wat er nodig is in 200 00:16:22,060 --> 00:16:27,480 Dit is een bijzonder ongehoorde - dit is een functie die we kunnen ook 201 00:16:27,480 --> 00:16:30,670 op te geven voor het niet hebzuchtig te zijn met andere functies. 202 00:16:31,480 --> 00:16:34,490 Maar dit is iets wat we moeten vooral in gedachten te houden 203 00:16:34,490 --> 00:16:38,720 als we kijken naar HTML tekst, dat is een reden dat 204 00:16:38,720 --> 00:16:41,500 reguliere expressies zijn moeilijk voor HTML. 205 00:16:42,460 --> 00:16:46,310 Want als je een HTML-tag geopend en vervolgens veel dingen in het midden 206 00:16:46,310 --> 00:16:49,820 en dan sommige andere HTML gesloten tag veel later in het programma, 207 00:16:49,820 --> 00:16:55,420 je net gegeten een hoop van uw HTML-code eventueel per ongeluk. 208 00:16:56,200 --> 00:17:01,840 >> Oke - dus meer speciale tekens, net als veel andere talen, 209 00:17:01,840 --> 00:17:04,780 We ontsnappen met behulp van de slash. 210 00:17:04,780 --> 00:17:10,329 Dus we kunnen de stip gebruiken om elk karakter te geven met uitzondering van een nieuwe lijn. 211 00:17:10,329 --> 00:17:14,550 We kunnen gebruik maken van de escape w om elke letter uit het alfabet geven. 212 00:17:14,550 --> 00:17:20,329 En naar analogie ontsnapping d voor elk geheel getal - numeriek karakter. 213 00:17:20,630 --> 00:17:27,440 We kunnen specificeren - kunnen we haakjes gebruiken om soortgelijke uitdrukkingen geven. 214 00:17:27,440 --> 00:17:30,970 Het zou dus a, b of c te accepteren. 215 00:17:31,320 --> 00:17:37,000 En we kunnen ook opties voor zowel a of b te specificeren of. 216 00:17:37,000 --> 00:17:41,110 Bijvoorbeeld - als we waren op zoek naar meerdere mogelijkheden 217 00:17:41,110 --> 00:17:44,940 tussen haakjes kunnen we het of operator te gebruiken als in - 218 00:17:44,940 --> 00:17:52,480 dus laten we teruggaan naar dit voorbeeld hier. 219 00:17:53,000 --> 00:17:59,790 En nu laten we - laten we teruggaan naar dit voorbeeld hier, en vervolgens 220 00:17:59,790 --> 00:18:12,290 neem ae - dus dit zou terugkeren - ik denk dat dit nog steeds Abraham. 221 00:18:12,290 --> 00:18:17,410 Dus dit - als we allemaal - geweldig. 222 00:18:17,410 --> 00:18:22,700 Dus laten we de tekst hier te werken. 223 00:18:22,700 --> 00:18:34,690 "Abraham eet ham terwijl zomen zijn -. Terwijl omzomen" Geweldig. 224 00:18:44,090 --> 00:18:47,330 Alle. Geweldig. Nu krijgen we ham, ham, en zoom. 225 00:18:48,510 --> 00:18:59,370 Terwijl zomen - terwijl neuriën hem - terwijl neuriën tot zoom hem. Geweldig. 226 00:19:00,350 --> 00:19:03,250 Hetzelfde. 227 00:19:03,820 --> 00:19:09,180 Nu alles keert nog net ham, ham, en zoom zonder het oppakken van de brom-of het hem. 228 00:19:09,940 --> 00:19:22,600 Geweldig - dus wat als we wilden om te kijken naar een van beide dat - dus we konden ook doen 229 00:19:23,510 --> 00:19:33,810 hem of - we zullen terugkomen naar dat. 230 00:19:34,810 --> 00:19:45,760 Oke - dus - oke - op de posities kunt u ook het dakje of het dollarteken gebruiken 231 00:19:45,760 --> 00:19:49,350 om aan te geven dat u op zoek bent naar iets aan het begin of het einde van een string. 232 00:19:50,260 --> 00:19:52,260 Of het begin of het einde van een woord. 233 00:19:52,400 --> 00:19:54,470 Dat is een manier om dat te gebruiken. 234 00:19:55,630 --> 00:20:01,160 >> Oke - dus laten we spelen met een iets grotere blok tekst. 235 00:20:03,950 --> 00:20:08,310 Laten we hier zeggen deze rij - deze verklaring hier. 236 00:20:08,310 --> 00:20:11,360 De kracht van reguliere expressies is dat ze patronen kunt opgeven 237 00:20:11,360 --> 00:20:13,390 niet alleen gefixeerd karakters. 238 00:20:14,900 --> 00:20:18,790 Laten wij - laten wij noemen dit blok. 239 00:20:22,400 --> 00:20:27,110 Dan zullen we dat allemaal in te lezen 240 00:20:28,890 --> 00:20:50,820 En dan een - laat ons allen =; dus wat zijn sommige dingen die we zouden kunnen zoeken in hier winstgevend? 241 00:20:50,820 --> 00:20:54,070 We konden kijken naar de expressie oor. 242 00:20:55,050 --> 00:21:01,520 Niet erg interessant. Hoe zit dat? We zullen zien wat er gebeurt. 243 00:21:03,710 --> 00:21:05,710 Ik gaf het een probleem. 244 00:21:06,380 --> 00:21:10,750 Dus een aantal dingen alvorens opnieuw en alles. 245 00:21:10,750 --> 00:21:15,630 Dus dat moet alles van het begin tot alle re misschien een paar keer terug. 246 00:21:18,800 --> 00:21:21,970 En dan hebben we hier de kracht van reguliere expressies is dat ze 247 00:21:21,970 --> 00:21:24,900 kunnen patronen specificeren niet alleen personages hier zijn. 248 00:21:24,900 --> 00:21:28,510 Dus de hele weg tot aan de uiteindelijke re, het begon met de meest linkse en was hebberig. 249 00:21:30,710 --> 00:21:32,710 Laat ons zien - wat anders zou zoeken we naar. 250 00:21:32,710 --> 00:21:39,860 Ik denk dat een ding als je geïnteresseerd bent in het zoeken naar de voornaamwoorden waren zij en hij, 251 00:21:39,860 --> 00:21:44,600 je zou kunnen controleren s gelijk is aan 0 of 1 252 00:21:44,600 --> 00:21:49,710 en de uitdrukking hij, en dat is waarschijnlijk niet van plan om terug te keren - 253 00:21:49,710 --> 00:21:58,020 oh, ik denk dat hij terug, want er zijn we op zoek naar de kracht, die dag, hier zijn. 254 00:22:00,590 --> 00:22:06,270 Laten we proberen te specificeren dat dit moet komen aan het begin van iets. 255 00:22:06,640 --> 00:22:09,530 Laten we zien of dat druppels uit. 256 00:22:09,530 --> 00:22:19,630 Dus kunnen we vet doen, en daar hebben we niets krijgen, omdat zij en hij 257 00:22:19,630 --> 00:22:22,870 niet voorkomen in deze zin. 258 00:22:24,960 --> 00:22:30,410 Geweldig. Oke - dus terug naar de kat hier. 259 00:22:30,410 --> 00:22:35,720 Dus complexe patronen wordt het kwetsen van de hersenen. 260 00:22:35,720 --> 00:22:40,500 Dus dat is waarom we gebruik van reguliere expressies om deze problemen te voorkomen. 261 00:22:40,820 --> 00:22:43,520 >> Dus hier zijn enkele andere handige functies heeft die u kunt spelen met. 262 00:22:43,520 --> 00:22:50,290 We keken naar zoeken vandaag, maar je kunt ook gebruik maken van wedstrijd, split, findall, en groepen. 263 00:22:50,290 --> 00:22:53,970 Zodat andere leuke dingen die je kunt doen met reguliere expressies dan alleen 264 00:22:53,970 --> 00:22:58,870 op zoek naar patronen is het nemen van een patroon en houdt alle wedstrijden - 265 00:22:58,870 --> 00:23:02,530 zijn variabelen - en vervolgens met behulp van deze in uw code later. 266 00:23:02,850 --> 00:23:05,980 Dat kan heel nuttig zijn. Andere dingen kunnen worden tellen. 267 00:23:05,980 --> 00:23:11,720 Dus we kunnen het aantal exemplaren van een reguliere expressie patroon te tellen, 268 00:23:11,720 --> 00:23:13,960 en dat is wat we groepen kunnen gebruiken voor. 269 00:23:13,960 --> 00:23:17,550 En andere modes, maar zijn ook mogelijk. 270 00:23:18,040 --> 00:23:22,980 Dus ik wil gewoon een beetje meer praten over andere manieren waarop u kunt gebruik maken van reguliere expressies. 271 00:23:22,980 --> 00:23:29,100 >> Dus een meer geavanceerde toepassing is in fuzzy matching. 272 00:23:29,100 --> 00:23:33,450 Dus als u op zoek bent naar een tekst voor de expressie, Julius Caesar, 273 00:23:33,450 --> 00:23:37,740 en je ziet ofwel Gaius Julius Caesar of de naam van Julius Caesar in andere talen, 274 00:23:37,740 --> 00:23:44,400 dan kun je misschien ook wat gewicht toe te kennen aan die waarden. 275 00:23:44,400 --> 00:23:48,930 En als het dichtbij genoeg - als het kruist een bepaalde drempel - dan wil je 276 00:23:48,930 --> 00:23:50,860 kunnen Julius Caesar accepteren. 277 00:23:50,860 --> 00:24:00,580 Dus er zijn een paar verschillende implementaties voor dat in een paar andere talen ook. 278 00:24:02,580 --> 00:24:08,420 Hier zijn een aantal andere instrumenten, Regex Pal - een handige kleine app online aan 279 00:24:08,420 --> 00:24:12,190 controleren of uw reguliere expressies correct zijn samengesteld. 280 00:24:12,190 --> 00:24:18,500 Er zijn ook standalone tools die u kunt uitvoeren vanaf uw bureaublad 281 00:24:18,500 --> 00:24:22,100 zoals Ultra Pico, en zo goed als alleen maar kookboeken. 282 00:24:22,100 --> 00:24:25,410 Dus als je bent bezig met een project dat een ton van reguliere expressies impliceert 283 00:24:25,410 --> 00:24:29,810 Dit is waarschijnlijk de plaats buiten het bereik van om te gaan. 284 00:24:31,520 --> 00:24:35,770 En dan alleen maar om u een idee van hoe vaak het is geven 285 00:24:35,770 --> 00:24:44,090 er grep in Unix, Perl heeft ingebouwd, en C is er PCRE voor C. 286 00:24:44,090 --> 00:24:48,890 En dan al die andere talen hebben ook reguliere expressie pakketten 287 00:24:48,890 --> 00:24:52,020 die werken met in essentie dezelfde syntax kregen we een voorproefje van vandaag. 288 00:24:52,020 --> 00:24:54,790 PHP, Java, Ruby, enzovoort. 289 00:24:56,080 --> 00:24:58,980 >> Google Code Search is eigenlijk het vermelden waard, het is een van de 290 00:24:58,980 --> 00:25:05,720 relatief weinig applicaties die er zijn dat het publiek in staat om toegang te krijgen 291 00:25:05,720 --> 00:25:07,800 de database met behulp van reguliere expressies. 292 00:25:07,800 --> 00:25:12,920 Dus als je kijkt op Google Code Search kunt u code te vinden 293 00:25:12,920 --> 00:25:16,880 als u op zoek bent naar een voorbeeld van hoe een functie zou kunnen worden gebruikt, 294 00:25:16,880 --> 00:25:21,610 kunt u een reguliere expressie gebruiken om die functie wordt gebruikt in allerlei verschillende zaken vinden. 295 00:25:21,610 --> 00:25:28,000 Je zou kunnen kijken voor fwrite, en dan kon je kijken naar de vlag van schrijf-of lees 296 00:25:28,000 --> 00:25:32,000 Als u een voorbeeld van fwrite worden gebruikt in dat geval wilden. 297 00:25:33,530 --> 00:25:37,010 Dus het zelfde ding daar, en hier zijn enkele referenties. 298 00:25:37,010 --> 00:25:40,990 Dit zal online beschikbaar zijn zo goed, dus gaan vooruit als 299 00:25:40,990 --> 00:25:45,560 je wilt kijken naar Python, grep, Perl - wil je gewoon wat inspiratie op te doen 300 00:25:45,560 --> 00:25:50,650 of als u wilt meer hier kijken naar de theorie zijn een aantal goede jumping off plaatsen. 301 00:25:50,650 --> 00:25:53,870 Heel hartelijk bedankt. 302 00:25:58,470 --> 00:25:59,910 [CS50.TV]