正則表達式是一種表示方式,讓你能夠查找匹配特定準則的文本,例如,「以字母 a 開頭」。此表示法讓你能夠寫一個表達式,選定或匹配多個數據字符串。
不少的UNIX工具程序沿用某一種正則表達式形式來強化自己的功能。這裏列舉一部分例子:
- 用來尋找匹配文本行的 grep 工具族:grep 與 egrep ,以及非標準但很好用的 agrep 工具。
- 用來改變輸入流的 sed 流編輯器( stream editor ),本章稍後將會介紹。
- 字符串處理程序語言,例如 awk、Icon、Perl、Python、Ruby、Tcl等。
- 文件查看程序(有時稱爲分頁程序,pagers ),例如 more、page、與 pg ,都常出如今商用UNIX系統上,另外還有 less分頁程序。
- 文本編輯器,例如歷史悠久的 ed 編輯器、標準的 vi 屏幕編輯器,還有一些插件(add-on)編輯器,例如 emacs、jed、jove、vile、vim 等。
正由於正則表達式對於UNIX的使用是這麼重要,因此花些時間把它們弄熟絕對不會錯,越早開始就能掌握得越好。
從根本上來看,正則表達式是由兩個基本組成部分所創建:通常字符與特殊字符。通常字符指的是任何沒有特殊意義的字符,正以下表中所定義的。在某些狀況下,特殊字符也能夠視爲通常字符。特殊字符常稱爲元字符( metacharacter ),本章接下來的部分都會以 meta 字符表示。
POSIX BRE 與 ERE 的 meta 字符
字符 |
BRE/ERE |
模式含義 |
\ |
二者均可 |
一般用以關閉後續字符的特殊意義。有時則是相反地打開後續字符的特殊意義,例如 \( ... \) 與 \{ ... \} 。 |
. |
二者均可 |
匹配任何單個的字符,但 NUL 除外。獨立程序也能夠不容許匹配換行字符。 |
* |
二者均可 |
匹配在它以前的任何數目(或沒有)的單個字符。以ERE而言,此前置字符能夠是正則表達式, .* 表明「匹配任一字符的任一長度」。以BRE來講, * 若置於正則表達式的第一個字符,不具任何特殊意義。 |
^ |
二者均可 |
匹配緊接着的正則表達式,在行或字符串的起始處。BRE:僅在正則表達式的開頭處具此特殊含義,ERE:置於任何位置都具特殊含義。 |
$ |
二者均可 |
匹配前面的正則表達式,在字符串或行結尾處。BRE:僅在正則表達式結尾處具此特殊含義,RER:置於任何位置都具特殊含義。 |
[...] |
二者均可 |
方括號表達式,匹配方括號內的任一字符。連字符(-)指的是連續字符的範圍。^符號置於方括號裏第一個字符則有反向含義:指的是匹配不在列表內的任何字符。做爲首字符的一個連字符或是結束方括號(]),則被視爲列表的一部分。全部其餘的 meat 字符也爲列表的一部分。房括號表達式裏可能會含有排序符號、等價字符集、以及字符集。 |
字符 |
BRE/ERE |
模式含義 |
\ {n,m \} |
BRE |
區間表達式,匹配在它前面的單個字符重現的次數區間。\{n\}指的是重現 n 次;\{n,\}則爲至少重現 n 次,而\{n,m\}爲重現 n 至 m 次。m的值必須介於0至255間 |
\ ( \) |
BRE |
將\( 與 \) 間的模式存儲在特殊的「保留空間」。最多能夠將9個獨立的子模式存儲在單個模式中。匹配於子模式的文本,能夠經過轉移序列\1至\9,被重複使用在相同模式裏,例如\(ab\).*\1,指的是匹配於ab組合的兩次重現,中間可存在任何數目的字符。 |
\n |
BRE |
重複在\ 方括號內第 n 個子模式至此點的模式。n爲1至9的數字,1爲由左開始。 |
{n,m} |
ERE |
與先前說起BRE的\{n,m\}同樣,只不過方括號前沒有反斜槓。 |
+ |
ERE |
匹配前面正則表達式的一個或多個實例。 |
? |
ERE |
匹配前面正則表達式的零個或一個實例。 |
| |
ERE |
匹配於|符號前或後的正則表達式。 |
( ) |
ERE |
匹配於方括號括起來的正則表達式羣。 |
簡單的正則表達式匹配範例