歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 磨練構建正則表達式模式的技能

磨練構建正則表達式模式的技能

日期:2017/2/28 11:25:51   编辑:關於Unix


  通過本文的學習,您可以增加一些有用的設計實際正則表達式 (regexp) 的技能。構建正則表達式是任何管理員日常工作中的一部分。為了構造返回所需條件的成功正則表達式,需要學習以模式匹配的角度進行思考,而這種技能需要花大量的時間進行練習。
引言
  UNIX® 管理員每天都需要構建和使用正則表達式 (regexp) 進行文本模式匹配。大多數語言都支持正則表達式的某種實現。有的應用程序(如 EMACS)具有正則表達式搜索功能,並且您可以通過各種命令行工具使用正則表達式。無論什麼應用程序,構建正確的正則表達式的關鍵之處在於,識別僅滿足需要匹配的數據的模式,以便在輸入中排除其他不必要的內容。
  出於這個目的,本文將逐步介紹幾種正則表達式模式構建技巧,並介紹它們如何幫助您完成各種常規任務。
使用正則表達式 (regexp)
除非特別說明,否則本文中使用的示例都是擴展可移植操作系統接口(擴展 POSIX)的正則表達式。如果通過命令行(如使用 egrep 實用工具)使用它們,您應該根據需要引用各種正則表達式。請記住,不同的正則表達式實現之間存在一些區別,您可能不得不適應所使用的特定的工具、應用程序或語言中的具體實現。
匹配整行內容
^ 元字符匹配行首,而 $ 匹配行尾,如果將它們組合在一起(如 ^$),它們將匹配空行。(這個表達式的鏡像,即 $^,是不可能匹配成功的,它將永遠 都無法匹配到有效行。)這個基本的正則表達式是許多復雜正則表達式的基礎,如果您還不習慣使用這個基本的正則表達式,那麼您應該逐步養成使用它的習慣。使用它來構建匹配整行內容 的模式。
在用戶字典文件 (/usr/dict/words) 中搜索是一個很好的基本模式。(有些版本的 UNIX 將用戶字典放在 /usr/share/dict/words 中。)
例如,假設您忘記了如何拼寫單詞 fuchsia。其中是否包含 sh 或 cs 呢?您所知道的只是,它以 fu 開頭並以 ia 結尾。
  嘗試使用這個模式進行搜索:
CODE:$ egrep -i '^fu.*ia-i 標志表示在搜索過程中不區分大小寫。在這個示例中,因為 fuchsia 拼寫正確,所以在返回的單詞中包括這個單詞。
[b]根據長度匹配行[/b]
  使用大括號元字符 ({ }) 指定前面的正則表達式匹配多少次,如表 1 所示。當您將它們添加到剛才介紹的整行搜索中時,您可以指定行的長度。
表 1. 大括號元字符的含義[code]示例 描述
{X} 這個字符對前面的正則表達式匹配 X 次。
{X,} 這個字符對前面的正則表達式匹配 X 或更多 次。
{X,Y} 這個字符對前面的正則表達式匹配至少 X 而不超過 Y 次。

並不是所有擴展正則表達式的實現都支持大括號。此外,根據具體的實現,您可能需要先使用反斜槓對其進行轉義。
  您可以使用這個正則表達式得到字典中以單詞長度為順序的報告。所獲得結果的數目取決於本地系統的字典文件中單詞的數目,然而,它應該與清單 1 所示類似。在這個示例中,最常見的單詞長度是 9 個字母,該字典中有 32,380 個匹配單詞。該字典中不包括 25 個字母或更長的單詞,並且最長的單詞並不是您認為的 21 個字母長的 disestablishmentarian(有 81 個同樣長度的單詞,包括 superincomprehensible 和 phoneticohieroglyphic),這個 UNIX 字典中最長的單詞有 5 個,包括 pathologicopsychological。
清單 1. 計算字典中 X 個字母的單詞的個數
CODE:$ for i in `seq 1 32`
> {
> echo "There are" `egrep '^.{'$i'} /usr/dict/words

-i 標志表示在搜索過程中不區分大小寫。在這個示例中,因為 fuchsia 拼寫正確,所以在返回的單詞中包括這個單詞。
根據長度匹配行
  使用大括號元字符 ({ }) 指定前面的正則表達式匹配多少次,如表 1 所示。當您將它們添加到剛才介紹的整行搜索中時,您可以指定行的長度。
表 1. 大括號元字符的含義[ DISCUZ_CODE_1 ]並不是所有擴展正則表達式的實現都支持大括號。此外,根據具體的實現,您可能需要先使用反斜槓對其進行轉義。
  您可以使用這個正則表達式得到字典中以單詞長度為順序的報告。所獲得結果的數目取決於本地系統的字典文件中單詞的數目,然而,它應該與清單 1 所示類似。在這個示例中,最常見的單詞長度是 9 個字母,該字典中有 32,380 個匹配單詞。該字典中不包括 25 個字母或更長的單詞,並且最長的單詞並不是您認為的 21 個字母長的 disestablishmentarian(有 81 個同樣長度的單詞,包括 superincomprehensible 和 phoneticohieroglyphic),這個 UNIX 字典中最長的單詞有 5 個,包括 pathologicopsychological。
清單 1. 計算字典中 X 個字母的單詞的個數[ DISCUZ_CODE_2 ] /usr/dict/words \
| wc -l` "$i-letter words in the dictionary."
> }
There are 52 1-letter words in the dictionary.
There are 155 2-letter words in the dictionary.
There are 1351 3-letter words in the dictionary.
There are 5110 4-letter words in the dictionary.
There are 9987 5-letter words in the dictionary.
There are 17477 6-letter words in the dictionary.
There are 23734 7-letter words in the dictionary.
There are 29926 8-letter words in the dictionary.
There are 32380 9-letter words in the dictionary.
There are 30867 10-letter words in the dictionary.
There are 26011 11-letter words in the dictionary.
There are 20460 12-letter words in the dictionary.
There are 14938 13-letter words in the dictionary.
There are 9762 14-letter words in the dictionary.
There are 5924 15-letter words in the dictionary.
There are 3377 16-letter words in the dictionary.
There are 1813 17-letter words in the dictionary.
There are 842 18-letter words in the dictionary.
There are 428 19-letter words in the dictionary.
There are 198 20-letter words in the dictionary.
There are 82 21-letter words in the dictionary.
There are 41 22-letter words in the dictionary.
There are 17 23-letter words in the dictionary.
There are 5 24-letter words in the dictionary.
There are 0 25-letter words in the dictionary.
There are 0 26-letter words in the dictionary.
There are 0 27-letter words in the dictionary.
There are 0 28-letter words in the dictionary.
There are 0 29-letter words in the dictionary.
There are 0 30-letter words in the dictionary.
There are 0 31-letter words in the dictionary.
There are 0 32-letter words in the dictionary.
$[/code] /usr/dict/words[/code]-i 標志表示在搜索過程中不區分大小寫。在這個示例中,因為 fuchsia 拼寫正確,所以在返回的單詞中包括這個單詞。
根據長度匹配行
  使用大括號元字符 ({ }) 指定前面的正則表達式匹配多少次,如表 1 所示。當您將它們添加到剛才介紹的整行搜索中時,您可以指定行的長度。
表 1. 大括號元字符的含義[ DISCUZ_CODE_1 ]並不是所有擴展正則表達式的實現都支持大括號。此外,根據具體的實現,您可能需要先使用反斜槓對其進行轉義。
  您可以使用這個正則表達式得到字典中以單詞長度為順序的報告。所獲得結果的數目取決於本地系統的字典文件中單詞的數目,然而,它應該與清單 1 所示類似。在這個示例中,最常見的單詞長度是 9 個字母,該字典中有 32,380 個匹配單詞。該字典中不包括 25 個字母或更長的單詞,並且最長的單詞並不是您認為的 21 個字母長的 disestablishmentarian(有 81 個同樣長度的單詞,包括 superincomprehensible 和 phoneticohieroglyphic),這個 UNIX 字典中最長的單詞有 5 個,包括 pathologicopsychological。
清單 1. 計算字典中 X 個字母的單詞的個數[ DISCUZ_CODE_2 ]
Copyright © Linux教程網 All Rights Reserved