[Powered by Google Translate] [研討會：正則表達式的模式匹配]
[約翰·Mussman哈佛大學]
[這是CS50. CS50.TV]
好吧。好吧，歡迎大家。這是CS50 2012。
我的名字是約翰，我今天將討論有關正則表達式。
正則表達式主要是一個工具，但有時也用
積極在代碼本質模式和字符串相匹配。
所以這裡有一個網絡漫畫XKCD。
在這個漫畫有一個神秘謀殺案，殺手
隨後有人在休假中，主角有
通過搜索尋找一個地址的200兆字節的電子郵件。
他們都放棄的時候，別人誰知道正則表達式 -
大概是一個超級英雄 - 猛撲下來，並寫了一些代碼
並解決了謀殺之謎。
因此推測，這將是東西，你將有權做
經過本次研討會。
我們只是要提供一個簡潔的語言介紹
給你足夠的資金去後，更多的資源在自己的。
>> 因此，正則表達式看起來基本上是這樣的。
在Ruby中，這是一個正則表達式。
這是不可怕的跨語言不同。
我們剛剛開始和斜線標記的正則表達式在Ruby。
，這是一個正則表達式來尋找電子郵件地址模式。
所以我們看到在第一位看起來任何字母數字字符。
這是因為電子郵件地址通常以字母字符開始。
然後任何特殊字符，然後由@符號。
然後同樣的事情，域名。
，然後在2和4個字符之間尋找。com，。網，等等。
所以這是正則表達式的另一個例子。
因此，正則表達式的協議文本中找到的格局。
他們做比較，選擇和更換。
所以第三個例​​子是查找所有目錄中的電話號碼54結束。
所以，大衛撕裂了CS50目錄中我們可以搜索
一個模式在那裡我們有括號，那麼3個數字，然後結束括號，
3個數字，一個破折號，2個號碼，然後54。
基本上，這將是我們如何來用正則表達式搜索。
>> 因此，有 - 我們已經做了一些事情，有點像CS50
正則表達式 - 例如 - 在dictionary.C文件
拼寫檢查問題集，你可能已經使用fscanf
讀一個字從字典。
你可以看到的百分比45S正在尋找一個45個字符的字符串。
因此，它是有點像一個基本的正則表達式。
你可以有適合該法案在那裡任意45個字符
和挑選那些了。
然後在最近的網絡規劃問題的第二個例子中
設置的發行代碼為PHP，我們其實有一個簡單的正則表達式。
而這一次只是簡單地檢查，如果網頁中傳遞
匹配任何登錄或註銷登記。PHP。
然後返回真或假的基礎上，正則表達式匹配。
>> 因此，當你使用正則表達式？
你為什麼在這裡呢？
所以你不希望有什麼東西時，使用正則表達式
為你做這項工作更容易。
所以，XML和HTML是實際上相當棘手
正如我們將看到在一點點寫正則表達式。
因此，有專門的那些語言的解析器。
你也需要經常會沒事的權衡和準確性。
如果您正在嘗試 - 讓我們看到了一個電子郵件地址的正則表達式，
但是說你想要一個特定的電子郵件地址，並逐步
正則表達式可能會變得更加複雜，因為它變得更精確。
因此，這將是一個權衡。
你必須要確保你好嗎正則表達式。
如果你確切地知道你正在尋找它可能會更有意義
投入的時間和寫更有效的解析器。
最後，有一個歷史的規律性問題
表情和語言。
事實上，正則表達式是強大得多
正則表達式的每一個正式意義上說。
>> 所以，我不想去太遠的正式理論，
但大多數的語言，我們的代碼實際上是不正規的。
這就是為什麼有時正則表達式不考慮所有的安全。
所以基本上是一個喬姆斯基語言層次，
和正則表達式建立工會，串聯，
Kleene星號操作，我們將看到在幾分鐘之內。
如果你有興趣在理論上有不少對那裡發生的引擎蓋下。
>> 所以簡史 - 只為這裡的語境 - 定期集上來
在20世紀50年代，然後我們有簡單的編輯器
註冊成立的正則表達式 - 只搜索字符串。
grep的 - 這是一個命令行工具 - 是第一個
納入正則表達式在20世紀60年代非常流行的工具。
在八十年代，Perl是 - 是一種編程語言，
採用正則表達式非常突出。
然後最近我們曾與Perl兼容的正則表達式
協議基本上在其他語言中使用許多相同的語法。
當然，最重要的事件是在2008年
那裡是第一屆全國正則表達式日，
我相信這是6月1日，如果你想慶祝。
>> 同樣，只是一點點的理論在這裡。
因此，有幾種不同的方法構造正則表達式。
一個簡單的方法是，你要構建的表達
上運行的字符串解釋 - 基本上是建立一個小的迷你節目，
將分析一個字符串的作品看，“哦，這符合正則表達式或不？”
然後運行。
所以，如果你有一個非常小的正則表達式，這可能是
最有效的方式做到這一點。
然後，如果您 - 另一種選擇，就是保持重建
表達你走了，那是模擬的可能性。
這些早期的嘗試正則表達式算法
相對簡單，比較快的，但沒有很大的靈活性。
因此，做一些事情，我們要看看
我們今天不得不做更複雜的正則表達式
實現可能要慢得多，所以是牢記
還有一個正則表達式拒絕攻擊品種
這些新的實現利用的潛力
正則表達式變得非常複雜。
在大致相同的意義上，我們看到在緩衝區溢出攻擊，
你有工作做出遞歸循環，攻擊
溢出的內存容量。
部分內容的方式是一個正則表達式的官方複數
牛在盎格魯 - 撒克遜的比喻。
>> 好吧，所以Python庫，許多人在這裡你的Mac計算機，
所以你實際上可以拉在你的屏幕上。
Python內建正則表達式。
所以Python預裝在Mac電腦上，也可在網上在這個環節。
所以，如果你看，你可以暫停，並確保了Python
我們玩在這裡。
有一個手動網上，所以如果你只需要輸入到您的計算機的Python
你將看到的版本出現在終端。
所以我提供了一個鏈接的手冊第2版的Python以及小抄。
有一個版本的Python，但你的Mac不一定
配備預加載。
所以不可怕不同。
好了，所以使用正則表達式在Python中的一些基本知識。
>> 所以在這裡我用一個非常簡單的表達，所以我做了Python的進口重
然後拿了re.search中的結果。
搜索需要兩個參數。
第一個是正則表達式，而第二個是文本
或者你要分析的字符串。
然後我打印出來的result.group。
因此，這些都是我們要看到今天的2個基本功能
學習正則表達式。
因此，只要打破這個正則表達式
h後，\ W，則m \ W只是在那裡接受任何字母字符。
所以，在這裡，我們正在尋找一個“H”，然後另一個字母字符
然後米，所以這裡將匹配火腿
“亞伯拉罕·林肯和火腿的三明治。”
這是該組的結果。
我們可以做的另一件事是在Python中使用我們之前的文本字符串。
所以我想我會繼續前進，拉在此處進行。
Python的進口重。
如果我是做同樣的事情 - 讓我們說文字是，
“亞伯拉罕，”讓我們放大 - 我們去那裡。
文字是：“亞伯拉罕吃火腿腸。”
好吧，然後導致= re.search。
，然後我們的表達可以是小時，然後我會做點米。
所以只需點的任何字符，包括數字是不是一個新的行，
個標誌，類似的事情。
文本 - 繁榮 - 然後result.group - 耶。
所以這是如何實現的基本功能在這裡。
如果我們有一個文本環 - 那個瘋狂的文本 - 包括很多回斜線說
字符串裡面的東西，可能看起來像轉義序列，
那麼我們可能想要使用原始的文本輸入，以確保接受。
只是看起來像。
因此，如果我們正在尋找我們不應該為他們每個人在那裡找到任何東西。
但是，這是你將如何實現它;只是之前的字符串
正則表達式，你把字母r。
>> 好了，讓我們繼續下去。
好吧 - 所以讓我們來看看一對夫婦重複模式。
所以，你想要做的一件事，是重複的東西
因為你是通過搜索文本。
因此，做一個由任意數量的b - 你檳*。
然後還有一系列的其他規則。
你可以看看所有這些了，我只是通過一些運行
最常用的。
所以AB +是一個由任意n大於0的b。
AB？是一個0或1的b。
AB {N}是一個由N b的，然後依此類推。
如果你有2個大括號中的數字，你指定範圍
可以是可能的匹配。
因此，我們將看看一對夫婦在一分鐘內重複模式。
因此，兩件事情要記住，當使用這些模式匹配工具。
所以說，我們想看看HM，“亞伯拉罕·林肯使得火腿的三明治。”
因此，我改變亞伯拉罕亞伯拉罕·林肯的名字。
現在我們正在尋找什麼是返回此搜索功能，
並且在這種情況下，只返回火腿。
它，只是因為搜索時，自然需要最左邊的隊列。
所有的正則表達式，除非你指定，否則將這樣做。
如果我們想找到所有有一項功能 - 全部找到。
所以這可能只是看起來像所有：=通過re.findall（'h.m'，文字）
然後all.group（）。
所有生產火腿及火腿，在這種情況下，兩者的字符串亞伯拉罕每個火腿。
因此，這是另一種選擇。
>> 大。要記住的另一件事是，正則表達式取最大直觀的。
讓我們看看下面這個例子。
這裡我們做了最左邊的搜索，然後我嘗試更大的搜索
使用Kleene星操作。
因此，“亞伯拉罕·林肯使火腿三文治，”我只回來
米作為一個結果。
該錯誤的原因是，我可以採取任何數量的
H公司的，因為我沒有指定什麼去H和M之間。
唯一的例子，有米 - 唯一的例子米
h的任意數量的串m。
然後我嘗試一遍，我說：“好吧，讓我們得到實際這裡最大的群體。”
，然後我做小時。*米，使剛剛返回任意數量的H和M之間的字符。
而且，如果你是剛剛開始，想，“哦，沒關係，這將
讓我火腿“，它實際上需要一切從H亞伯拉罕·林肯
一路攀升至年底的火腿。
它是貪婪的，它看到小時 - 這一切其他文本 - 米，
這是它的需要。
這是一個特別令人震驚的 - 這是一個功能，我們也可以
為它指定使用其他功能不能貪。
但是，這是我們必須牢記，特別是
看著HTML文本時，這是一個原因，
正則表達式是很難的HTML。
因為如果你有一個HTML的開放標記，然後在中間的東西很多
然後一些其他HTML關閉標籤很久以後在節目中，
你剛才吃了不少你的HTML代碼中可能的錯誤。
>> 所有權利 - 讓更多的特殊字符，像許多其他語言，
我們逃避使用斜線。
所以我們可以使用點新行指定以外的任何字符。
我們可以使用逃生w來指定任何字母字符。
類推逃生d為任意整數 - 數字字符。
我們可以指定 - 我們可以使用括號來指定相關的表達式。
因此，這將接受A，B，或C。
我們也可以指定或為A或B的選項。
例如 - 如果我們所期待的多種可能性
如在括號中，我們可以使用或操作 -
所以讓我們回到這個例子在這裡。
現在，就讓我們來 - 讓我們回到這個例子，然後
AE - 所以這應該返回 - 我想這仍然是亞伯拉罕。
因此，這 - 如果我們這樣做 - 偉大。
所以，讓我們這裡的文字更新。
“亞伯拉罕吃火腿腸，而捲邊縫邊，而他 - 。”大。
所有。大。現在，我們得到的火腿，火腿和下擺。
儘管邊飾 - 一邊哼著他 - 邊哼著下擺他。大。
同樣的事情。
現在，所有仍然只是返回火腿，火腿和下擺的嗡嗡聲或他不拿起。
大 - 還等什麼，如果我們想看看在任 - 所以我們也可以做
他 - 我們會回來的。
好吧 - 讓 - 所有權利 - 位置，你也可以使用插入符號或美元符號
指定你正在尋找的東西在開始或結束的字符串。
或詞語的開始或結束。
這是一個使用該方法。
>> 好了 - 所以讓我們玩弄一個稍大的文本塊。
讓我們在這裡說此行 - 這一說法在這裡。
正則表達式的力量是，他們可以指定圖案
不只是固定的字符。
讓我們 - 讓我們調用該功能塊。
然後，我們將讀取所有，在。
，然後有一個 - 讓我們所有=，那麼，有哪些事情是我們可以在這裡搜索盈利？
我們可以看看的表達的耳朵。
不是很有趣。怎麼樣？我們看看會發生什麼。
我給它一個問題。
所以任何數量的東西，然後再重新和所有。
所以，應該一切從開始到全部重新也許幾次返回。
那麼在這裡，我們的力量正則表達式是
可以指定圖案，這裡不僅僅是個字符。
所以最後再一路上漲，最左邊的開始和貪婪。
讓我們來看看 - 我們還有什麼可以期待。
我想一件事，如果你有興趣尋找代詞她和他，
你可以檢查是等於0或1
他的表情，那可能是不打算返回 -
哦，我想還給他，因為我們正在尋找電源，那一天，這裡的。
讓我們試著指定來的東西開始。
讓我們看看是否有脫落。
因此，我們可以做的脂肪，那裡，我們沒有得到任何東西，因為她和他
不發生在這個短語中。
大。好了 - 所以這裡的貓。
這麼複雜的圖案傷害大腦。
所以這就是為什麼我們使用正則表達式來避免這些問題。
>> 因此，這裡有一些其他有用的模式，你可以玩。
我們期待在今天的搜索，但你也可以使用匹配，分割，謂詞和團體。
所以，等涼的東西，你可以用正則表達式除了剛剛
尋找模式，採取一個模式，並保持所有的比賽 -
其變量 - 然後在你的代碼中使用這些以後。
這可以是相當有幫助的。其他的事情可能會被計數。
因此，我們可以數一數，正則表達式模式的實例，
而這正是我們可以利用組。
模式和其他模式也是可能的。
所以，我只是想談多一點點的其他方法，你可以使用正則表達式。
>> 因此，一個更先進的應用程序是在模糊匹配。
所以，如果你正在尋找一個文本的表達，凱撒，
您看到蓋烏斯·尤利烏斯·凱撒凱撒大帝的名字在其他語言，
那麼你可能還需要一些重量分配到這些值。
而如果是足夠接近 - 如果超過一定的閾值 - 然後你想
能夠接受凱撒大帝。
因此，有一對夫婦，在不同的實現以及其他一些語言。
這裡有一些其他的工具，正則表達式的好朋友 - 一個方便的小應用程序在線
檢查如果你的正則表達式是由正確。
也有獨立的工具，您可以從您的桌面上運行
像超皮克，以及剛剛食譜。
所以，如果你正在做一個項目，涉及一噸的正則表達式
這大概是今天的範圍之外的地方去。
然後只給你的感覺是多麼常見
在Unix的grep，Perl也有內置，和C有PCRE C.
然後所有這些其他的語言也有正則表達式包
操作基本上是相同的語法，我們得到了今天的味道。
PHP，Java中，紅寶石，等等。
>> 谷歌代碼搜索實際上是值得一提，它是一個
相對較少的應用程序，允許公眾訪問
其數據庫使用正則表達式。
所以，如果你看一下谷歌代碼搜索，你可以找到代碼
如果你正在尋找一個實例如何可能會使用一個函數，
發現功能被用在各種不同的情況下，你可以使用正則表達式。
你可以看看fwrite的，然後你可以看看寫的國旗或讀
如果你想在這種情況下被使用的fwrite的一個例子。
於是同樣的事情，在這裡，是一些參考。
這將可在網上，所以轉發
你想要看的Python中，grep，Perl的 - 你只是想從中得到一些啟發
或者，如果你想看看在這裡的理論有一些很好的地方起跳。
非常感謝。
[CS50.TV]