正則表達式儲備(一)
正則表達式,又稱規則表達式,通常被用來檢索、替換那些符合某個模式(規則)的文本。是對字符串(包括普通字
(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符
及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
通俗的了解就是給定一個正則表達式和另一個字符串,我們可以達到如下的目的:
1. 給定的字符串是否符合正則表達式的過濾邏輯(稱作“匹配”)
2. 可以通過正則表達式,從字符串中獲取我們想要的特定部分。
正則表達式的靈活性、邏輯性和功能性非常強,使用正則表達式可以迅速地用極簡單的方式達到字符串的復雜控制。
正則表達式符號
正則表達式的核心在於利用事先定義好的特定字符、及其組合簡單迅速的來達到我們處理文本的目的。所以
對字符的掌握也是學習正則表達式的核心。我們把被定義了特殊定義的字符稱為元字符,元字符也是正則表達式的
核心部分,正式因為對元字符的靈活應用,才使得正則表達式可以用極其簡單的方式來的處理文本。對於元字符,
一共有四類:字符匹配、匹配次數、位置錨定和分組。詳解如下:
字符匹配:
. 匹配任意的單個字符
[] 匹配指定範圍內的任意單個字符。比如,“[abc]可以匹配‘plan’中的a”
[^] 匹配指定範圍外的任意單個字符。比如,“[abc]可以匹配‘plan’中的pln”
[a-z]或[:lower:] 匹配所有的小寫字母字符
[A-Z]或[:upper:] 匹配所有的大寫字母字符
[0-9]或[:digit:] 匹配數字0到9
[:alpha:] 匹配所有的大小寫字母,等同於[a-zA-Z]
[:blank:] 匹配空白字符(空格和制表符)
[:space:] 匹配水平和垂直的空白字符
[:punct:] 匹配標點符號
[:print:] 匹配可打印字符
[:graph:] 匹配可打印的非空白字符
匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數
* 匹配前面的子表達式任意次。例如zo*能z,也能匹配“zo”或“zoo”。等價於o{0,}
\+ 匹配前面的子表達式一次或多次。例如zo+匹配“zo”或“zoo”,但是不能匹配“z”,等價於o{1,}。
\? 匹配前面的子表達式零次或一次。例如“do(es)?”可以匹配“do”或“does”,等價於(es){0,1}。
\{n\} 匹配前面的字符n次,例如o{2}不能匹配“boy”中的o,但是可匹配“food”中的o
\{m,n\} 匹配前面的字符至少m次,最多n次。例如,“o{1,3}”將匹配“fooooood”中的前三個o為一組,後三個o為一組。
“o{0,1}”等價於“o\?”。
\{,n\} 匹配前面的字符至少n次
\{n,\} 匹配前面的字符至多n次
位置錨定:定位出現的位置
^ 行首鎖定,用於模式的最左側
$ 行尾錨定,用於模式的最右側
^PATTERN$ 用於模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\<或\b 詞首錨定,用於單詞模式的左側
\>或\b 詞尾錨定,用於單詞模式的右側
\<PATTERN\> 匹配整個單詞
\b 匹配一個單詞的邊界。也就是指單詞和空格間的位置,例如“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
分組:
\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(root\)\+
分組括號中的模式匹配到的內容會被引擎記錄於內部的變量中,這些變量的命名方式為
: \1,\2,\3…
\1 表示從左側起的第一個左括號以及與之匹配的右括號之間的模式所匹配的字符。
向後引用: 引用前面的分組括號中的模式所匹配字符,而非模式本身。
\| 例如 a\|b :表示a或b C\|cat 表示Cat或cat
正則表達式應用
正則表達式的重要性體現在廣泛的應用上,例如:
1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 國內電話號碼(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
4 ×××號(15位、18位數字):^\d{15}|\d{18}$
5 日期格式:^\d{4}-\d{1,2}-\d{1,2}
6 空白行的正則表達式:\n\s*\r (可以用來刪除空白行)
7 騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
8 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址時有用)
9 IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
……
結語
對於正則表達式的學習剛剛入門,正則表達式的應用中的實例每一個都思考了很久,對於初學者而言,
晦澀難懂,一知半解是不可避免的,前期的學習利用正則表達式處理好邏輯關系是很重要的一步,另外
大量的練習和查閱資料都是必要的。
正則表達式儲備(一)