linux下關(guān)于正則表達(dá)式grep的一點(diǎn)總結(jié)
正則表達(dá)式(Regular Expression)是用于描述一組字符串特征的模式,用來(lái)匹配特定的字符串。通過(guò)特殊字符+普通字符來(lái)進(jìn)行模式描述,從而達(dá)到文本匹配目的工具。類似于生活中常見(jiàn)的尋人啟示,通過(guò)描述一個(gè)人的特征來(lái)進(jìn)行“搜索匹配”
如今正則已經(jīng)被我們廣泛應(yīng)用,目前被集成到了各種文本編輯器/文本處理工具當(dāng)中
應(yīng)用場(chǎng)景**驗(yàn)證: **表單提交時(shí),進(jìn)行用戶名密碼驗(yàn)證。**查找: **從大量信息中快速提取指定內(nèi)容。在一批url中,查找指定url替換: 將指定格式的文本,進(jìn)行正則匹配查找,找到之后進(jìn)行特定替換,(vim文本替換等)
在很多技術(shù)領(lǐng)域(比如,自然語(yǔ)言處理,數(shù)據(jù)存儲(chǔ)等),正則表達(dá)式可以很方便的提取出我們想要的信息,所以這部分必不可少構(gòu)成基本要素字符類數(shù)量限定符位置限定符特殊符號(hào)
1. 字符類:
| 字符 | 說(shuō)明 | 舉例 |
|---|---|---|
| . | 匹配任意的一個(gè)字符 | abc. 可以匹配abcd、abc0等 |
| [] | 匹配 [] 內(nèi)的任意一個(gè)字符 | [012]a可以匹配0a、1a、2a |
| - | 在括號(hào)內(nèi)表示字符范圍 | 如[0-9]可以匹配任何一個(gè)數(shù)字 |
| ^ | 放在[]內(nèi)前面表示匹配除括號(hào)中字符外的任意一個(gè)字符 | [^ab]c可以匹配1c、dc,但是不能匹配ac、bc |
| [[:xxx:]] | grep工具預(yù)定義的一些命名字符類 | [[:digit:]]可以匹配一個(gè)數(shù)字,[[:alpha:]]匹配一個(gè)字符,[[:lower:]]匹配任何一個(gè)小寫字母等 |
應(yīng)用:
grep使用--color選項(xiàng)將匹配的字符串以紅色標(biāo)注出來(lái)Linux下可以用echo $?來(lái)打印上一條命令執(zhí)行的退出碼,為0表示執(zhí)行成功,1表示失敗。
實(shí)驗(yàn)如下:

注意:使用 . 默認(rèn)為貪心匹配,和后面的正則匹配方式相關(guān),后面再述。

2. 數(shù)量限定符:
| 字符 | 說(shuō)明 | 舉例 |
|---|---|---|
| ? | 匹配緊跟它前面的單元(前面的一個(gè)數(shù)字或字符) 0或1次 | 如匹配小數(shù),用0\.?[0-9]匹配0.1 、0.2、0.3等;由于.在正則里面是特殊符號(hào)所以需要用\進(jìn)行轉(zhuǎn)義操作(后面再說(shuō)) |
| + | 匹配緊跟它前面的單元 1或多次 | [a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.com匹配一個(gè)郵箱地址 |
| * | 匹配緊跟它前面的單元0或多次 | [0-9][0-9]*匹配至少一位數(shù)字,等價(jià)于[0-9]+ |
| {N} | 精確匹配緊跟它前面的單元N次 | [0-9]{3}匹配000到999之間的數(shù)字 |
| {N,} | 匹配緊跟它前面的單元至少N次 | [0-9]{3,}匹配三位及其以上的數(shù)字 |
| {,M} | 匹配緊跟它前面的單元最多M次 | [0-9]{,1}等價(jià)于[0-9]? |
| {N,M} | 匹配緊跟它前面的單元N~M次 | 近似匹配IP地址:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} |
應(yīng)用:


3. 位置限定符:
| 字符 | 說(shuō)明 | 舉例 |
|---|---|---|
| ^ | 匹配行首位置,從行首開(kāi)始匹配 | ^world只匹配一行開(kāi)頭的world |
| $ | 匹配行末位置,從行末尾開(kāi)始匹配 | ;$匹配一行末尾的;號(hào),^$匹配空行 |
| < | 匹配單詞開(kāi)始位置 | < th匹配this,不匹配teach、ethernet |
| \> | 匹配單詞末尾位置 | p\>匹配sleep、leap等,不匹配parent、sleepy |
| \b | 匹配單詞的開(kāi)始位置、末尾位置 | 如 \borld匹配world、aorld,\borld\b只匹配orld |
| \B | 匹配非單詞的開(kāi)頭、末尾位置 | 如 \Bat\B匹配battery,不匹配attend、hat等以字符串"at"開(kāi)頭、結(jié)尾的單詞 |
注意:其中 \b 用來(lái)限定是目標(biāo)串中是否有以指定字符串開(kāi)頭的單詞,我們稱之為詞界。 \B 稱之為非詞界
應(yīng)用:

4. 特殊符號(hào):
| 字符 | 說(shuō)明 | 舉例 |
|---|---|---|
| \ | 轉(zhuǎn)義字符,普通字符轉(zhuǎn)義為特殊字符,特殊字符轉(zhuǎn)義為普通字符 | <寫成<匹配單詞開(kāi)頭,.前面加上\寫成\.取 . 的字面值 |
| () | 將正則表達(dá)式的一部分括起來(lái)組成一個(gè)單元,可以對(duì)整個(gè)單元使用數(shù)量限定符 | ([0-9]{1,3}\.){3}[0-9]{3}匹配IP地址 |
| | | 連接兩個(gè)子表達(dá)式,表示或的關(guān)系 | n(o|either)匹配no或neither |
應(yīng)用:
( )將包含內(nèi)容括起來(lái)作為一個(gè)整體,進(jìn)而通過(guò)數(shù)量限定符限定。

| 用來(lái)級(jí)聯(lián)多個(gè)條件,只要有任意一個(gè)匹配,即可匹配,表示或者關(guān)系,我們稱之為析取符,

正則表達(dá)式版本其他常用通用字符集及其替換
| 符號(hào) | 等價(jià)于 | 匹配 |
|---|---|---|
| \d | [0-9] | 數(shù)字字符 |
| \D | [^0-9] | 非數(shù)字字符 |
| \w | [a-zA-Z0-9_] | 數(shù)字字母下劃線 |
| \W | [^\w] | 非數(shù)字字母下劃線 |
| \s | [_\r\t\n\f] | 表格,換行等空白區(qū)域 |
| \S | [^\s] | 非空白區(qū)域 |
于是, 我們現(xiàn)在可以用這些符號(hào)來(lái)簡(jiǎn)化我們正則表達(dá)式的編寫了?試試

可是結(jié)果好像并不如我們所愿?其實(shí)這里還與正則表達(dá)式版本有關(guān)。正則分為以下幾個(gè)版本:
基本的正則表達(dá)式(Basic Regular Expression 又叫 Basic RegEx 簡(jiǎn)稱 BREs)擴(kuò)展的正則表達(dá)式(Extended Regular Expression 又叫 Extended RegEx 簡(jiǎn)稱 EREs)Perl 的正則表達(dá)式(Perl Regular Expression 又叫 Perl RegEx 簡(jiǎn)稱 PREs)
在grep中指定相應(yīng)的參數(shù)即可,而這幾個(gè)版本中默認(rèn)的就是基本正則,帶上-E選項(xiàng)就是擴(kuò)展正則,而帶上-P參數(shù)就是用perl版正則。解決前面的問(wèn)題,我們這里讓grep帶上-P選項(xiàng)便可解決了
版本間區(qū)別正則表達(dá)式的Extended規(guī)范和Basic規(guī)范基本相同。只是在Basic規(guī)范下,有些字符 ?+{}|() 應(yīng)解釋為普通字符,要表示上述特殊含義則需要加 \ 轉(zhuǎn)義。反之,在Extended規(guī)范下, ?+{}|() 應(yīng)該被理解成特殊含義,要取其字面值,也要對(duì)其進(jìn)行\(zhòng) \ 轉(zhuǎn)義。所以, grep 工具帶上 -E 選項(xiàng),表示使用擴(kuò)展正則來(lái)進(jìn)行匹配(亦可直接使用egrep 命令操作),若沒(méi)有,則表示使用基準(zhǔn)正則進(jìn)行匹配。帶-P選項(xiàng)使用的perl正則匹配。它是perl語(yǔ)言集成的最重要的一種特性,它十分強(qiáng)大,很多語(yǔ)言設(shè)計(jì)正則式支持的時(shí)候基本上都參考Perl的正則表達(dá)式。正則匹配模式
貪婪模式
正則表達(dá)式去匹配時(shí),會(huì)盡量多的去匹配符合條件的內(nèi)容,grep命令 默認(rèn)使用的就是貪婪匹配,
非貪婪模式
正則表達(dá)式去匹配時(shí),會(huì)盡量少的匹配符合條件的內(nèi)容 也就是說(shuō),一旦發(fā)現(xiàn)匹配符合要求,立馬就匹配成功,而不會(huì)繼續(xù)匹配下去(除非有g(shù)選項(xiàng),開(kāi)啟下一組匹配)
總結(jié):可以看到,非貪婪模式的標(biāo)識(shí)符,就是貪婪模式的標(biāo)識(shí)符后面加上一個(gè) ?
相關(guān)文章
15個(gè)常用的javaScript正則表達(dá)式(收藏)
本文是小編收集整理的15個(gè)常用的javascript正則表達(dá)式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-05-05
正則表達(dá)式實(shí)現(xiàn)字符串每4位后自動(dòng)加空格效果(兩種方法)
本文通過(guò)兩種方法給大家介紹了正則表達(dá)式實(shí)現(xiàn)字符串每4位后自動(dòng)加空格效果,需要的朋友可以參考下2018-09-09
解決正則表示式匹配($regex)引起的一次mongo數(shù)據(jù)庫(kù)cpu占用率高的問(wèn)題
這篇文章主要介紹了由正則表示式匹配($regex)引起的一次mongo數(shù)據(jù)庫(kù)cpu占用率高的問(wèn)題,本文通過(guò)實(shí)例給大家分析的非常詳細(xì),需要的朋友可以參考下2019-11-11
Java正則表達(dá)式實(shí)現(xiàn)經(jīng)緯度的合法性操作
這篇文章主要介紹了Java正則表達(dá)式實(shí)現(xiàn)經(jīng)緯度的合法性操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

