[Powered by Google Translate] [Seminario: Skemo Kongruoj kun Regulaj Esprimoj] [John Mussman-Universitato Harvard] [Ĉi tiu estas CS50.-CS50.TV] Okay. Nu, bonvenon ĉiuj. Ĉi tiu estas CS50 2012. Mia nomo estas Johano kaj mi estos parolas hodiaŭ pri regulaj esprimoj. Regulaj esprimoj estas unuavice ilo, sed ankaŭ iam uzita en kodo aktive por esence kongruas ŝablonoj kaj ŝnuro. Do jen retejo komikaj de xkcd. En ĉi tiu komikso estas murdo mistero kie la murdisto havas sekvis iu en ferioj, kaj la ĉefroluloj devas serĉi tra 200 megabajtojn da retmesaĝoj serĉas adreso. Kaj ili estas rezigni kiam iu, kiu scias regulaj esprimoj - supozeble superhéroe - swoops malsupren kaj skribas iujn kodo kaj solvas la murdo mistero. Do supozeble ke estos iu kiu vi estos rajtigita fari post ĉi tiu seminario. Ni nur tuj havigos koncizan enkondukon al la lingvo kaj donu vin sufiĉe Per kio iri post pli da rimedoj en via propra. Do regulaj esprimoj aspektas esence kiel ĉi tio. Tio estas regula esprimo en Ruby. Ne estas terure malsamaj trans lingvoj. Ni havas nur sur slashes komenci kaj marki la regula esprimo en Ruby. Kaj jen estas regula esprimo por serĉi en retadreso ŝablono. Do ni vidas en la unua bito serĉas ajnan alfanuméricas karaktero. Tio estas ĉar retadresoj ofte devas komenci kun alfabeta karaktero. Kaj tiam neniu speciala signo sekvata de la @ simbolo. Kaj tiam la sama afero por domajna nomo. Kaj poste inter 2 kaj 4 karakteroj por serĉi la. Com,. Net, kaj tiel plu. Do tio estas alia ekzemplo de regula esprimo. Do regulaj esprimoj estas protokolojn por trovi patters en teksto. Ili faras komparojn, unuarangaj kaj anstataŭantoj. Do la tria ekzemplo estas trovi cxiujn telefonnumerojn finante en la 54 en dosierujo. Do antaux David eltiras ĝis la CS50 katalogo ni povus serĉi mastro kie ni havas krampoj tiam 3 numerojn tiam fini parentezo, Ankoraŭ 3 numerojn, skripto, 2 nombroj, kaj tiam 54. Kaj tio estus esence kiel ni supreniru kun regula esprimo por serĉi tiu. Do estas - ni faris kelkajn aĵojn en CS50 kiuj estas iom kiel regulaj esprimoj, do - ekzemple - en la dictionary.C dosieron por la sorĉas ĉekon problemo aro vi eble uzis fscanf legi en vorto de la vortaro. Kaj vi povas vidi la procento 45s serĉas ĉenon de 45 signoj. Do estas iom kiel rudimenta regula esprimo. Kaj vi povas havi ajnan 45 karakteroj kiuj trafas la priskribo en tie kaj repreni tiujn supren. Kaj tiam la dua ekzemplo en la plej freŝa retejo programado problemo aro en la distro kodon por php ni efektive ja havas simplan regula esprimo. Kaj ĉi tiu estas nur simple serĉas por kontroli se la retpaĝo kiu pasis en egalas ĉu ensaluto aŭ logout registriĝi. PHP. Kaj poste reveni vera aŭ falsa bazita sur tiu regula esprimo kongruanta. Do kiam vi uzas regulan esprimon? Kial vi estas ĉi tie hodiaŭ? Do vi ne volas uzi regulan esprimon kiam tie estas iu kiu faras la laboron por vi eĉ pli facile. Do XML kaj HTML estas fakte sufiĉe malfacila skribi regulaj esprimoj por kiel ni vidos en iomete. Do estas dediĉita sintaksaj analiziloj por tiuj lingvoj. Vi ankaŭ devas esti bone kun la komerco offs kaj precizeco ofte. Se vi provas - tiel ni vidis regula esprimo por retadreson sed diru vi volis specifa retadreso kaj laŭgrade la regula esprimo fariĝu pli kompleksa kiel ĝi faris pli preciza. Do kiu estus unu komerco ekstere. Vi devas esti certa, ke vi bonfartas fari kun la regula esprimo. Se vi scias precize kion vi serĉas ĝi povus fari pli sentita meti en la tempo kaj skribi pli efika sintaksa analizilo. Kaj fine ekzistas historia temo kun la reguleco de esprimoj kaj lingvoj. Regulaj esprimoj estas vere multe pli potenca ol regulesprimoj por diri en formala senso. Do mi ne volas iri tro malfrue en la formala teorio, sed plimulto el la lingvoj kiujn ni kodon en vere ne estas regula. Kaj tio estas kial regulesprimoj foje ne konsideris ĉiujn kiuj sekura. Do esence estas Hierarkio laŭ Ĉomski de lingvoj, kaj regulaj esprimoj estas konstrui uzante kuniĝo, kunmeto, kaj la Stelo de Kleene operacio kiu vidos post kelkaj minutoj. Se vi estas interesita en teorio estas sufiĉe multe okazas tie sub la kapuĉo. Tiel mallonga historio - nur por la kunteksto tie - regulaj aroj venis en la 1950-aj jaroj, kaj tiam ni havis simplan eldonistoj kiuj korpigis regulaj esprimoj - nur serĉas kordoj. Grep - kiu estas komandlinio ilo - estis unu el la unuaj tre popularaj iloj kiuj korpigis regulaj esprimoj en la jaroj 1960. En la 80, Perl estis konstruita - estas programlingvo, kiu korpigas regulaj esprimoj tre elstare. Kaj tiam pli lastatempe ni havis Perl kongrua regula esprimo protokoloj esence en aliaj lingvoj kiuj uzas multe de la sama sintakso. Kompreneble la plej grava evento estis en 2008 kie ne estis la unua Nacia Regulaj Esprimoj Tago, kiun mi kredas estas junio 1 se vi volas okazigi tion. Denove, nur iom pli teorion tie. Do estas kelkaj malsamaj manieroj konstrui regulesprimoj. Unu simpla vojo estas konstrui la esprimo kiu vi iras kuri sur la kordo interpreti - esence konstrui iom mini-programo kiu analizos pecoj de ŝnuro kaj vidu, "Ho, ne ĉi persvadis la regula esprimo aŭ ne?" Kaj poste kuros tio. Do se vi havas tre malgrandan regula esprimo, ĉi tio estas probable la plej efika maniero por fari ĝin. Kaj tiam se vi - alia eblo estas subteni rekonstrui la esprimo dum vi iros, kaj tiu estas la simuli eblo. Kaj tiuj fruaj provoj de regula esprimo algoritmoj estis relative simpla kaj relative rapida, sed ne havis multan flekseblecon. Do fari eĉ iuj el la aĵoj kiuj tuj rigardi hodiaŭ ni devis fari pli kompleksajn regula esprimo realigoj, kiu estas potenciale multe pli malrapida, tiel ke estas iu al konsideri Ekzistas ankaŭ regulajn esprimojn neado de atako vario kiuj ekspluatas la potencialon por tiuj pli novaj realigoj de regulesprimoj fariĝi tre kompleksa. Kaj en multa la sama senco, kiun ni vidis en buffer overflow atakoj, vi havas atakoj kiuj laboras farante rekursie maŝojn kiuj invadita de la kapablo de memoro. Kaj por iu Regexen estas unu el la oficialaj pluraloj de regula esprimo per analogio al bovoj en la anglosaksa. Bone, do la Python Library multaj el vi tie en persono havas Mac, do vi povas reale tiri ĉi supre sur via ekrano. Regulaj esprimoj estas konstruitaj en Python. Kaj tiel Python estas precargada sur Mac kaj ankaŭ disponebla rete ĉe ĉi tiu ligilo. Do se vi rigardas vi povas paŭzo kaj certigi vin havas Python kiel ni ludi ĉi tie. Estas manlibro linio, do se vi simple tajpi Python en vian komputilon Vi vidos ke la versio venas en la terminalo. Do mi havigis ligon al la manlibro por versio 2 de Python tiel kiel cheat folio. Ekzistas versio 3 de Python, sed via Mac ne nepre veni kun tiu precargada. Do ne terure malsamaj. Bone, do iuj fundamentojn de uzi regulajn esprimojn en Python. Do jen mi uzis tre simpla esprimo, do mi faris Python importado re kaj tiam ili prenis la rezulto de re.search. Kaj la serĉo prenas 2 argumentojn. La unua estas la regula esprimo, kaj la dua estas la teksto aŭ kordo vi volas analizi. Kaj tiam mi presis el la result.group. Do jen estas la 2 bazaj funkcioj tuj vidas hodiaŭ en lerni pri regulaj esprimoj. Do nur detruado ĉi regula esprimo ĉi tie h kaj tiam \ w kaj tiam m tiom \ w nur akceptas ajnan alfabeta signo en tie. Do jen ni serĉas "h" kaj poste alia alfabeta karaktero kaj tiam m, do tie kiu kongruas ŝinko en, "Abraham Lincoln kaj ŝinko sandviĉoj." Ĉi tio estas la rezulto de tiu grupo. Alia afero kiun ni povas fari estas uzi nian antaŭ kordoj de teksto en Python. Do mi supozas mi iros antaŭen kaj tiri ke ĝis ĉi tie. Pitono importado re. Kaj se mi faras la samon - ni diru teksto, "Abraham," ni zomi - tie ni iru. Teksto estas, "Abraham manĝas ŝinko." Bone, kaj do rezulti = re.search. Kaj tiam nia esprimo povas esti h, kaj do mi faros dot m. Do dot simple prenas iun karakteron, ke tiu ne estas nova linio inter nombroj, procenton signoj, nenio simila. Kaj tiam teksto - eksplodo - kaj tiam result.group--yeah. Do tio estas precize kiel apliki bazajn funkciojn tie. Se ni havis teksto ringo ke - ke freneza teksto - inkludis diri multajn reen slashes kaj ŝnuro ene kaj aĵoj kiuj povus aspekti kiel eskapo sekvencoj, tiam ni probable volas uzi la krudan tekston enigo por certigi ke estas akceptita. Kaj tio nur aspektas tiel. Do, se ni serĉas ĉiun el ili tie ni ne trovos ion. Sed tio estas kiel vi devus apliki ĝin; ĝuste antaŭ la sinsekvo de la regula esprimo vi metas la literon r. Bone, do ni plu iri. Bone - do ni rigardu kelkajn repetitivo ŝablonoj ĉi tie. Do unu afero, kiun vi volas fari estas ripeti tion kiel vi serĉas tra tekston. Do fari sekvata de ajna numero de b - vi faras ab *. Kaj tiam estas serio de aliaj reguloj tro. Kaj vi povas rigardi ĉiujn tiujn supren; mi nur kuras tra iu el la plej kutime uzitaj. Do ab + estas sekvata de ajna N pli granda ol 0 de b. abo? estas sekvita de 0 aŭ 1 de b. ab {N} estas sekvita per N de b, kaj poste tiel plu. Se vi havas 2 ciferoj en la krispa krampoj vi specifante gamo kiu povas esti eble kongruis. Do ni rigardu pli ĉe paro repetitivo ŝablonoj en unu minuto. Do 2 aĵoj devas konsideri uzinte tiujn ŝablona rekono iloj tie. Do ke ​​ni volas rigardi la hm de, "Abraham Lincoln faras ŝinko sandviĉoj." Do mi ŝanĝis Abraham Lincoln nomon al Abraham. Kaj nun ni serĉas kio revenis por ĉi tiu serĉo funkcio, kaj ĝi nur redonas ŝinko en ĉi tiu kazo. Kaj ĝi faras tion ĉar serĉo ĝuste nature prenas la maldekstra plej vosto. Kaj ĉiuj regulaj esprimoj se vi specifas alie tion ĉi faros. Se ni volis trovi ĉiuj estas funkcio por ke - trovos ĉiujn. Do kiu povis nur rigardi kiel ĉiuj = re.findall ('h.m', teksto) kaj tiam all.group (). Ĉiuj produktas ambaŭ ŝinko kaj ŝinko; en ĉi tiu kazo ambaŭ de la ŝnuroj en Abraham ĉiu ŝinko. Do tio estas alia eblo. Granda. La alia afero konsideri estas ke regulaj esprimoj prenas la plej granda intuicie. Ni rigardu tiun ekzemplon. Ni faris tion maldekstra plej serĉo tie, kaj tiam mi provis pli grandan serĉo uzante la Stelo de Kleene operatoro. Do por, "Abraham Lincoln faras ŝinko sandviĉoj," kaj mi nur alvenis reen E kiel rezulto. La kialo por tiu eraro estis ke mi povis esti prenita ajna kvanto de h estas ĉar mi ne specifis ion por iri en inter h kaj m. La sola ekzemplo tie kiu havis m - la sola ekzemploj tie kun m en ĝi kaj ajnan numeron de h estas estis nur la kordoj m. Tiam mi provis ĝin denove, mi diris, "Bone, ni prenu la efektiva plej granda grupo ĉi tie." Kaj poste mi faris h. * M, tiel ke nur revenas ajna nombro da signoj inter h kaj m. Kaj se vi ĵus komencas eliri kaj pensis, "Ho, bone, bone ĉi tio min ŝinko, "tio efektive prenas ĉion de la h en Abraham Lincoln tuta vojo ĝis la fino de ŝinko. Ĝi estas avida; vidas h - ĉio tio alia teksto - m, kaj tio estas kio faras in Ĉi tio estas aparte egregious - tio estas karakterizaĵo ni povas ankaŭ specifi por ne esti avida uzas aliajn funkciojn. Sed tio estas io, kion ni devas havi en menso speciale kiam rigardante HTML teksto, kiu estas unu kialo ke regulaj esprimoj estas malfacila por HTML. Ĉar se vi havas HTML malferma tag kaj poste multaj aĵoj en la mezo kaj tiam iuj aliaj HTML fermita etikedo multe poste en la programo, vi ĵus manĝis grandan kvanton de via HTML kodo eble por eraro. Bone - tiom pli specialaj karakteroj, kiel multaj aliaj lingvoj, ni forsavigxos uzante la oblikvo. Do ni povas uzi la skalara specifi ajnan karakteron krom por nova linio. Ni povas uzi la eskapo w specifi ajnan alfabeta karaktero. Kaj per analogio eskapo d por ajna entjero - nombra karaktero. Ni povas specifi - ni povas uzi krampojn specifi rilatajn esprimojn. Do tiu akceptus a, b, aŭ c. Kaj ni povas ankaŭ specifi aŭ eblojn por ĉu aŭ b. Ekzemple - se ni serĉas plurajn eblecojn en krampoj ni povus uzi la aŭ operatoro kiel en - do ni reiru al ĉi tiu ekzemplo tie. Kaj nun ni prenu - ni reiru al ĉi tiu ekzemplo tie ĉi, kaj poste preni ae - tial ĉi devus redoni - mi supozas ĉi estas ankoraŭ Abraham. Do tio - se ni faru ĉiuj - granda. Do ni ĝisdatigi la tekston ĉi tie. "Abraham manĝas ŝinkon dum Hemming sia - dum Hemming." Granda. Ĉiuj. Granda. Nun ni preni ŝinko, ŝinko, kaj malsupra rando. Dum Hemming - dum zumante al li - dum zumante al randon li. Granda. Sama afero. Nun ĉiuj revenas ankoraŭ nur ŝinko, ŝinko, kaj malsupra rando sen repreni la hum aŭ li. Granda - do kio se ni volis rigardi cxu ke - tiel ni povus ankaŭ fari lin aŭ - ni revenos al tio. Bone - tiel - ĉiuj dekstra - en poziciojn vi povas uzi ankaŭ la caret aŭ la dolaro signo specifi ke vi serĉas ion je la komenco aŭ la fino de ĉeno. Aŭ la komenco aŭ la fino de vorto. Tio estas unu maniero por uzi tiun. Bone - do ni amuziĝu kun iomete pli granda bloko de teksto. Ni diras tion vico tie - ĉi aserto tie. La povo de regula esprimo estas ke ili povas specifi ŝablonoj ne nur fiksaj karakteroj. Ni kreu - ni nomas tion bloko. Tiam ni legos ĉiujn kiuj in Kaj tiam havas - ni faru ĉiuj =, do kio estas iuj aferoj ni povus serĉi en ĉi tie profite? Ni povus serĉi la esprimo orelon. Ne tre interesa. Kion pri tio? Ni vidos kio okazas. Mi donis ĝin problemo. Do iu numero de aĵoj antaŭ re kaj ĉiujn. Por ke devus reveni ĉion de la komenco ĝis ĉiuj re eble paron foje. Kaj tiam tie ni havas la povon de regulaj esprimoj estas ke ili povas specifi ŝablonoj ne ĝuste gravuloj tie estas. Do la tuta vojo ĝis la fino re, ĝi komenciĝis per la maldekstra plej kaj estis avida. Ni vidu - kion alian ni povus serĉi. Mi supozas ke unu afero, se vi interesiĝas pri serĉante la pronomojn ŝi kaj li, vi povus kontroli por s estante egalaj al 0 aŭ 1 kaj la esprimo, kaj ke ĝi probable ne tuj revenos - ho, mi supozas ke revenis li ĉar ni rigardas la povo, tiu tago, tie estas. Ni klopodu specifante ke tiu devas veni en la komenco de io. Ni vidu se tiu falas for. Do ni povas fari grason, kaj tie ni ne akiras nenion ĉar ŝi kaj li ne okazas en tiu frazo. Granda. Bone - do reen al la kato tie. Tiel kompleksa ŝablonoj estas vundi la cerbo. Tial estas kial ni uzas regulajn esprimojn por eviti tiujn temojn. Do jen kelkaj aliaj utilaj manieroj vi povas ludi ĉirkaŭe kun. Ni rigardis serĉo hodiaŭ, sed vi ankaŭ povas uzi partio, disigo, findall kaj grupoj. Do aliaj malvarmeta aĵoj vi povas fari kun regulaj esprimoj krom nur serĉante mastrojn prenas mastro kaj tenante ĉiujn turnirojn - ĝiaj variabloj - kaj tiam uzanta tiuj en via kodo poste. Tio eblas sufiĉe utila. Aliaj aĵoj povus rakonti. Do ni povas kalkuli la nombron de okazoj de regula esprimo ŝablono, kaj tio estas kion ni povas uzi grupoj por. Kaj aliaj modoj tiel estas ankaŭ ebla. Do mi simple deziras rakonti iom pli pri aliaj manieroj vi povas uzi regulajn esprimojn. Do pli progresinta apliko estas en fuzzy kongruanta. Do se vi serĉas teksto por la esprimo, Julio Cezaro, kaj vi vidos ĉu Gajo Julio Cezaro aux la nomon Julio Cezaro en aliaj lingvoj: tiam vi povus ankaŭ volas atribui iujn pezon al tiuj valoroj. Kaj se ĝi estas sufiĉe proksime - se ĝi transiras certa sojlo - tiam vi volas por povi akcepti Julius Cezaro. Do estas kelkaj malsamaj realigoj por tiu en kelkaj aliaj lingvoj tiel. Jen kelkaj aliaj iloj, regex Pal - oportuna iom app linio por kontrolu ĉu via regulaj esprimoj estas formitaj ĝuste. Ankaŭ estas sendependa iloj kiuj vi povas kuri el via labortablo kiel Ultra Beko, kaj tiel kiel ĵus recetarios. Do se vi faras projekton kiu engaĝas barelon de regulaj esprimoj ĉi tio estas probable la lokon por iri ekstere de la medio de hodiaŭ. Kaj tiam nur por doni al vi la senton de kiel komuna estas estas grep en Unikso, Perl havas integrita, kaj C estas PCRE por C. Kaj tiam ĉiuj tiuj aliaj lingvoj ankaŭ havas regulan esprimon pakoj kiuj operacias kun esence la sama sintakso ni akiris guston de hodiaŭ. PHP, Java, Ruby, kaj tiel plu. Google Code Search estas vere menciindas: ĝi estas unu el la relative malmultaj aplikoj tie kiu permesas al la publikaj aliri lia datumbazo uzante regulaj esprimoj. Do, se vi rigardas en Google Code Search vi povas trovi kodo se vi serĉas petskribon de kiel funkcio povus esti uzita, vi povas uzi regulan esprimon por trovi ke funkcio estante uzita en ĉiaj malsamaj kazoj. Vi povus serĉi fwrite, kaj tiam vi povus serĉi la flago de skribu aŭ legi se vi volas ekzemplon de fwrite esti uzata en tiu kazo. Do la saman aferon tie, kaj jen kelkaj referencoj. Ĉi tiu estos havebla surlinia tiel, do irante antaŭen se vi volas rigardi Python, grep, Perl - vi nur volas akiri iun inspiro aŭ se vi volas rigardi pli al la teorio jen kelkaj bonaj salti for lokoj. Dankon tre multe. [CS50.TV]