2021-05-12 14:32:11
Linux 基礎入門教學----正規表示式基礎
介紹
雖然我們這一節的標題是正規表示式,但實際這一節只是介紹grep
,sed
,awk
這三個命令,而正規表示式作為這三個命令的一種使用方式(命令輸出中可以包含正規表示式)。正規表示式本身的內容很多,要把它說明清楚需要單獨一門課程來實現,不過我們這一節中涉及到的相關內容通常也能夠滿足很多情況下的需求了。
一、正規表示式
什麼是正規表示式呢?
正規表示式,又稱正規表示式、正規表示法、正規表示式、規則表示式、常規表示法(英語:Regular Expression,在程式碼中常簡寫為 regex、regexp 或 RE),電腦科學的一個概念。正規表示式使用單個字串來描述、匹配一系列符合某個句法規則的字串。在很多文字編輯器裡,正規表示式通常被用來檢索、替換那些符合某個模式的文字。
許多程式設計語言都支援利用正規表示式進行字串操作。例如,在 Perl 中就內建了一個功能強大的正規表示式引擎。正規表示式這個概念最初是由 UNIX 中的工具軟體(例如
sed
和grep
)普及開的。正規表示式通常縮寫成“regex”,單數有 regexp、regex,複數有 regexps、regexes、regexen。
簡單的說形式和功能上正規表示式和我們前面講的萬用字元很像,不過它們之間又有很大差別,特別在於一些特殊的匹配字元的含義上,希望初學者注意不要將兩者弄混淆。
Linux正規表示式sed 詳述 http://www.linuxidc.com/Linux/2015-04/116309.htm
Linux正規表示式特性及BRE與ERE的區別 http://www.linuxidc.com/Linux/2014-03/99152.htm
grep使用簡明及正規表示式 http://www.linuxidc.com/Linux/2013-08/88534.htm
正規表示式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm
正規表示式之零寬斷言 http://www.linuxidc.com/Linux/2013-03/81897.htm
Linux中正規表示式與檔案格式化處理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm
基礎正規表示式 http://www.linuxidc.com/Linux/2014-09/106296.htm
常用正規表示式整理 http://www.linuxidc.com/Linux/2014-10/108076.htm
1. 舉例
假設我們有這樣一個文字檔案,包含"shiyanlou",和"shilouyan"這兩個字串,同樣一個表示式:
shi*
如果這作為一個正規表示式,它將只能匹配 shi,而如果不是作為正規表示式*
作為一個萬用字元,則將同時匹配這兩個字串。這是為什麼呢?因為在正規表示式中*
表示匹配前面的子表示式(這裡就是它前面一個字元)零次或多次,比如它可以匹配"sh","shii","shish","shiishi"等等,而作為萬用字元表示匹配萬用字元後面任意多個任意字元,所以它可以匹配"shiyanlou",和"shilouyan"兩個字元。
體驗完了,下面就來開始正式學習正規表示式吧。
2.基本語法:
一個正規表示式通常被稱為一個模式(pattern),為用來描述或者匹配一系列符合某個句法規則的字串。
選擇
|
豎直分隔符表示選擇,例如"boy|girl"可以匹配"boy"或者"girl"
數量限定
數量限定除了我們舉例用的*
,還有+
加號,?
問號,.
點號,如果在一個模式中不加數量限定符則表示出現一次且僅出現一次:
+
表示前面的字元必須出現至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;?
表示前面的字元最多出現一次(0次或1次),例如,"colou?r",可以匹配"color"或者"colour";*
星號代表前面的字元可以不出現,也可以出現一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。
範圍和優先順序
()
圓括號可以用來定義模式字串的範圍和優先順序,這可以簡單的理解為是否將括號內的模式串作為一個整體。例如,"gr(a|e)y"等價於"gray|grey",(這裡體現了優先順序,豎直分隔符用於選擇a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(這裡體驗了範圍,?
將圓括號內容作為一個整體匹配)。
語法(部分)
正規表示式有多種不同的風格,下面列舉一些常用的作為 PCRE 子集的適用於perl
和Python
程式語言及grep
或egrep
的正規表示式匹配規則:(由於markdown表格解析的問題,下面的豎直分隔符用全形字元代替,實際使用時請換回半形字元)
PCRE(Perl Compatible Regular Expressions中文含義:perl語言相容正規表示式)是一個用 C 語言編寫的正規表示式函數庫,由菲利普.海澤(Philip Hazel)編寫。PCRE是一個輕量級的函數庫,比Boost 之類的正規表示式庫小得多。PCRE 十分易用,同時功能也很強大,效能超過了 POSIX 正規表示式庫和一些經典的正規表示式庫。
字元 | 描述 |
---|---|
將下一個字元標記為一個特殊字元、或一個原義字元。例如,“n”匹配字元“n”。“n”匹配一個換行符。序列“”匹配“”而“(”則匹配“(”。 | |
^ | 匹配輸入字串的開始位置。 |
$ | 匹配輸入字串的結束位置。 |
{n} | n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。 |
{n,} | n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。 |
{n,m} | m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。 |
* | 匹配前面的子表示式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等價於{0,}。 |
+ | 匹配前面的子表示式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。 |
? | 匹配前面的子表示式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價於{0,1}。 |
? | 當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜尋的字串,而預設的貪婪模式則盡可能多的匹配所搜尋的字串。例如,對於字串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。 |
. | 匹配除“n”之外的任何單個字元。要匹配包括“n”在內的任何字元,請使用像“(.|n)”的模式。 |
(pattern) | 匹配pattern並獲取這一匹配的子字串。該子字串用於向後參照。要匹配圓括號字元,請使用“(”或“)”。 |
x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。 |
[xyz] | 字元集合(character class)。匹配所包含的任意一個字元。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字元僅有反斜線保持特殊含義,用於跳脫字元。其它特殊字元如星號、加號、各種括號等均作為普通字元。脫字元^如果出現在首位則表示負值字元集合;如果出現在字串中間就僅作為普通字元。連字元 - 如果出現在字串中間表示字元範圍描述;如果如果出現在首位則僅作為普通字元。 |
[^xyz] | 排除型(negate)字元集合。匹配未列出的任意字元。例如,“[^abc]”可以匹配“plain”中的“plin”。 |
[a-z] | 字元範圍。匹配指定範圍內的任意字元。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字元。 |
[^a-z] | 排除型的字元範圍。匹配任何不在指定範圍內的任意字元。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字元。 |
優先順序
優先順序為從上到下從左到右,依次降低:
運算子 | 說明 |
---|---|
跳脫符 | |
(), (?:), (?=), [] | 括號和中括號 |
*、+、?、{n}、{n,}、{n,m} | 限定符 |
^、$、任何元字元 | 定位點和序列 |
| | 選擇 |
regex的思導圖:
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-08/121441p2.htm
相關文章