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