Linux 正则表达式基础
【概述】
正則表達式(Regular Expression),在代碼中常簡寫為 regex、regexp 或 RE,是計算機科學中的一個概念。
正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。
在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
許多程序設計語言都支持利用正則表達式進行字符串操作,例:在 Perl 中內建了一個功能強大的正則表達式引擎。
正則表達式這個概念最初是由 UNIX 中的工具軟件 set 、grep 等普及開的。
簡單的說形式和功能上正則表達式與通配符很像,不過它們之間又有很大差別,區別在于一些特殊的匹配字符的含義上。
【基本語法】
一個正則表達式通常被稱為一個模式(pattern),用來描述或者匹配一系列符合某個句法規則的字符串。
1.選擇
| 豎直分隔符表示選擇,例:" boy | girl " 可以匹配 " boy " 或者 " girl "。
2.數量限定
表數量限定的符號有:+ 加號、? 問號、* 星號,一個模式中不加數量限定符則表示出現一次且僅出現一次。
| + | 前面的字符必須出現至少一次(1次或多次) |
| ? | 前面的字符最多出現一次(0次或1次) |
| * | 前面的字符可以不出現,也可以出現一次或者多次(0次、或1次、或多次) |
例:
1)" goo+gle ",可以匹配 " gooogle "、" goooogle " 等
2)" colou?r ",可以匹配 " color "、" colour " 等
3)"?0*42 ",可以匹配 " 42 "、" 042 "、" 0042 "、" 00042 " 等。
3.范圍和優先級
() 圓括號可以用來定義模式字符串的范圍和優先級,這可以簡單的理解為是否將括號內的模式串作為一個整體。例如,"gr(a|e)y"等價于"gray|grey",(這里體現了優先級,豎直分隔符用于選擇a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(這里體驗了范圍,?將圓括號內容作為一個整體匹配)。
4.常用語法
正則表達式有多種不同的風格,下面列舉一些常用的作為 PCRE 子集的適用于perl和python編程語言及grep或egrep的正則表達式匹配規則。
PCRE(Perl Compatible Regular Expressions),perl 語言兼容正則表達式,是一個用 C 語言編寫的正則表達式函數庫,是一個輕量級的函數庫,比 Boost 之類的正則表達式庫小得多。
| \ | 將下一個字符標記為一個特殊字符、或一個原義字符 |
| ^ | 匹配輸入字符串的開始位置 |
| $ | 匹配輸入字符串的結束位置 |
| {n} | 匹配確定的n次 |
| {n,} | 至少匹配n次 |
| {n,m} | 最少匹配n次且最多匹配m次 |
| * | 匹配前面的子表達式零次或多次,等價于 {0,} |
| + | 匹配前面的子表達式一次或多次,等價于 {1,} |
| ? | 匹配前面的子表達式零次或一次,等價于 {0,1} |
| ? | 當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。 |
| . | 匹配除 " \n " 外的任何單個字符,要匹配包括 " \n " 在內的任何字符,請使用像 " (.|\n) " 的模式。 |
| (pattern) | 匹配 pattern 并獲取這一匹配的子字符串,該子字符串用于向后引用,若要匹配圓括號字符,請使用 " \( " 或 " \) " |
| x|y ? | 匹配 x 或 y |
| [xyz] | 字符集合,匹配所包含的任意一個字符。 |
| [^xyz] | 排除型字符集合,匹配未列出的任意字符 |
| [a-z] | 字符范圍,匹配指定范圍內的任意字符 |
| [^a-z] | 排除型的字符范圍,匹配任何不在指定范圍內的任意字符 |
例:
1)" n " 匹配字符 " n " ," \n " 匹配一個換行符,序列" \\?" 匹配" \?" ," \(?" 匹配 " (?"
2)" o{2} " 不能匹配 " Bob " 中的 " o ",但是能匹配 " food " 中的兩個 " o "
3)" o{2,} " 不能匹配 " Bob " 中的 " o ",但能匹配 " foooood " 中的所有 " o "
4)" o{1,3} " 將匹配 " fooooood " 中的前三個 " o "
5)" zo* " 能匹配 " z "、" zo " 以及 " zoo "
6)" zo+ " 能匹配 " zo " 以及“zoo”,但不能匹配 " z "
7)" do(es)? " 可以匹配 " do " 或 " does " 中的 "do?"
8)對于字符串 " oooo "," o+? " 將匹配單個 " o ",而 " o+ " 將匹配所有 " o "
9)" z|food " 能匹配 " z " 或 " food "," (z|f)ood " 則匹配 " zood " 或 " food "
10)" [abc] " 可以匹配 " plain " 中的 " a "
11)" [^abc] " 可以匹配 " plain " 中的 " plin "
12)" [a-z] " 可以匹配 " a " 到 " z " 范圍內的任意小寫字母字符
13)" [^a-z] " 可以匹配任何不在范圍內的任意字符
5.符號優先級
優先級為從上到下從左到右,依次降低
| \ | 轉義符 |
| ()、(?:)、(?=)、[] | 括號和中括號 |
| *、+、?、{n}、{n,}、{n,m} | 限定符 |
| ^、$、\任何元字符 | 定位點和序列 |
| | | 選擇 |
? ?
?? ?
?? ?
總結
以上是生活随笔為你收集整理的Linux 正则表达式基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 挖地雷(信息学奥赛一本通-T1262)
- 下一篇: An Easy Problem(信息学奥