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