本來只是想說要找 Regular Express 的一些快速參考的文件來看看..
沒想到不小心發現了 Study-area 的一份教學文件..
寫的太棒了... 🙂
轉錄 Regular Express 進來快速參考用.. 🙂
深入探討的內容轉載自 Script大集合
以下內容轉載自 Script大集合
基本字元表示
字元,就是單一一個英文字母的處理。先來個基本的字元
* . 代表任意"一個"字元除了換行newline字元不過awk可以match換行記住
* ? 代表"前面"字元出現0次或1次
* + 代表"前面"字元出現1次以上 1 2 3 4 ... 不出現return false
* * 代表"前面"字元出現0次以上 0 1 2 3 ...
這邊初學者比較常犯的錯誤是在shell下的wildcard * 的習慣,以為只要給個* 就代表所有字元,其實是 ? + * 都要前面搭配 . 來使用才能代表任意字元
* ^ 代表行首
* $ 代表行尾
* \ 脫逃字元(escape)取消特定字元的涵義用的
這邊比較要注意的是字在行首起頭的^,行尾的$,與在行中的case分屬不同 的regular express,小心有的程式會把這三種當成不同的regular express, 這會不一樣喔。不過有的不會。
* /^#/ 有#在一行的第一字元時 就還回TRUE
* /^bag/ bag在行首的行
* /bag$/ bag結尾的行
* /bag/ bag在中間的行 不過有的程式處理沒有這麼嚴格像sed
* /b.g/ 表示bag beg bug都行
* /b\.g/ 表示b.g
* /^..g/ 表示行首bag beg bug xxg都符合 但一定要三個字母
* /^.*g/ 表示行首有任何字元的然後有個g的都可以還回true
* /beg*/ be, beg, begg, beggg, .......
* /beg+/ beg, begg, beggg, begggg, ......
* / */ 空白字元也行
字元處理 - 括號與範圍表示
* [ ] []內的任一"單一字元"符合就還回TRUE
* [^ ] []的反效果 不含[]內的任一單一字元 還回true, 所以這邊^在[]內有不同的意義
* [1-10] -號在[]內可以表示一段範圍不用打到手酸死, 所以如果要表示-號必須放在第一或最後字元
* w{n,m} 連續字元出現表示法
比用 /.../好用 跟LATEX中的table的用法很像,表示有"連續"符合 w字元出現''連續'' n次到m次
都會還回TRUE
* 0{3,} 0至少出現3次 -> /xxxx000xxxxxx/
在字串下{} ()是表示真的這些字元的,不像[ ]會被regular express當成一種運算,所以不要忘了用脫逃字元 變成\{ \} \( \)。
字串處理 - 不同括號表示
一些字串的處理上
* ( ) Group operator
* (str1|str2|str3) str1或者str2或者str3
() 與 |是extend的regular expression 只有一些軟體如egrep才有支援。所以在用軟體的regex 時必須知道他能處理的regex能力。
* & 表示找到的字串
* \1 \2 \3 ... 代表s///中前面用括號\(\)括起來的字串, 這通常也是找到的字串,不過&只有一個, 用 \1 \2 \3 可以有很多個。
\1 表第一個括號內字串
\2 表第二個括號內字串
通常\1 \2 \3是用來對match到的字串還要再處理時用的
/[Yy]es/ Yes 和 yes
/80[23]?86/ 8086 80286 或者80386
/[A-Za-z0-9]/ 字元可以有這樣的連續表示法
/compan(y|ies)/ company companies
/0\{3,\}/ 表示0要出現三次以上
s/.*/(&)/ 將原本的行加上括號( )
s/\(str1\) \(str2\)/\2 \1/ 把兩個字串對調 注意\1 \2的用法
其中& \1 \2 \3 ...這些常用在代換(substitue)中
注意括號在前面有不同意義,所以必須用\來escape。