[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]