正則表達(dá)式---重點

聲明:所有文章只作為學(xué)習(xí)筆記用,轉(zhuǎn)載非原創(chuàng)

在線正則
 https://blog.csdn.net/shellching/article/details/76527720 

-------編程語言支持高級正則表達(dá)式 還是很有難度的
grep / sed awk 文本編輯器 IDE 都支持基礎(chǔ)正則

分類:
基礎(chǔ)正則  bre  basic regular expression 
擴展        ere   extended regular expression 
變成語言支持的正則

BRE和ERE語法基本一致 只有部分元字符需要區(qū)別對待

擴展正則中這些元字符可以直接使用 :  ?   举哟、 + 、  {   、 } 、 | 葵蒂、   ( 、 )

基礎(chǔ)正則這些字符都需要加反斜線轉(zhuǎn)義: \?   重虑、 \+  践付、\{   、  \}  缺厉、   \|  荔仁、\( 、 \)   
提示:基礎(chǔ)正則中這些符號加反斜線芽死, 才能具有通配功能。不加的話就是普通字符

eascape \  轉(zhuǎn)義:是引用單字符的方法.在單個字符前面的轉(zhuǎn)義符(\ 倒斜杠)告訴shell不必特殊解釋這個字符次洼,只把它當(dāng)成字面上的意思. 


 # echo '1234 helo world 學(xué),U)&)^&[]' | grep  -E 'h?'
1234 helo world 學(xué),U)&)^&[]
 # echo '1234 helo world 學(xué),U)&)^&[]' | grep  'h?'
   echo '1234 helo world 學(xué),U)&)^&[]' | grep  'h\?'
grep  sed 默認(rèn)使用基礎(chǔ)正則
grep -E  关贵、 sed -r  、  egrep  卖毁、  awk 擴展正則

基本作用: 搜索文本
學(xué)習(xí)正則本質(zhì)就是學(xué)習(xí)各種各樣的元字符揖曾,并記住這些元字符的含義。
元字符: 預(yù)定義好的具有特殊含義的符號亥啦,這些符號能夠進(jìn)行通配炭剪。
可讀性非常差

單引號”; 雙引號””; 反向單引號引用強弱程度比較
 https://www.cnblogs.com/wkfvawl/p/9982442.html 

grep 正則
https://www.cnblogs.com/songgj/p/8906005.html
https://www.cnblogs.com/lovychen/p/7429682.html 

#語法
grep -E 'pattern'  filename
cmd | grep -E 'pattern'

#設(shè)置一些環(huán)境變量
echo $GREP_COLORS
grep --color=auto/always  -E xxx.txt
cat ~/.bashrc  配置環(huán)境變量就可以不用打命令的時候加選項了
exec $SHELL  #設(shè)置bashrc 生效 重新加載shell 相當(dāng)于退出重登

#純普通字符匹配,相當(dāng)于精確匹配
  
echo "hello world"  | grep 'world' 
sycn
echo 3 >/proc/sys/vm/drop_caches

grep -E '4574' a.txt   #精確
grep -E '[1-9]{4}' a.txt # 非精確搜索

#基礎(chǔ)正則元字符 

1 匹配字符:
 abc : 匹配字符串 "abc " ,普通字符的匹配
[abcde] : 匹配中括號內(nèi)的任意單個字符
                a[xyz]b : 可以匹配 axb ayb 不能匹配 aab abb
              #根據(jù)示例 了解匹配過程  
               [root@master ~]# echo "hello world" | grep -E 'h[abcde]'
               hello world                      #只能匹配到he
               [root@master ~]# echo "hello worhd" | grep -E 'h[abcde]'
               hello worhd                     #可以匹配到he hd

1.1 中括號: 匹配的全是括號內(nèi)的單個字符
x[abc]z : xaz xbz xcz
取反:
x[^abc]b : 只要不是中括號中的字符翔脱,都可以匹配
范圍
[a-z] [^a-z]
[A-Z]
[0-9]
[0-59] : 表示匹配[0,1,2,3,4,5,9] 不是0到59
            echo "36" | grep -E '[0-59]'   #只能匹配到3
            echo "a8" | grep -E '[0-59]'   # 不能匹配到任何
[a-z0-9A-Z]
[A-z] [a-Z] :建議不要寫這種橫跨大小寫范圍的表達(dá)式奴拦,不同地方范圍表達(dá)的含義不同

有些按照字典順序排序時候,
[a-d] : 不等價于abcd ,而是aBbCcDd 
           如果想要等價于abcd 需要locale 環(huán)境設(shè)置為C
           LC_ALL=C
            https://www.cnblogs.com/wajika/p/6592659.html 
 https://blog.csdn.net/z4213489/article/details/7937894 

 LC_ALL
它是一個宏届吁,如果該值設(shè)置了错妖,則該值會覆蓋所有LC_*的設(shè)置值绿鸣。注意,LANG的值不受該宏影響暂氯。
"C"是系統(tǒng)默認(rèn)的locale潮模,"POSIX"是"C"的別名。所以當(dāng)我們新安裝完一個系統(tǒng)時痴施,默認(rèn)的locale就是C或POSIX擎厢。
locale 包括(Language), 地域 (Territory) 和字符集(Codeset)
zh_CN.UTF-8,zh代表中文辣吃,CN代表大陸地區(qū)动遭,UTF-8表示字符集
locale的書寫格式為: 語言[_地域[.字符集]]
LC_ALL和LANG優(yōu)先級的關(guān)系: LC_ALL > LC_* >LANG 

#中括號如何匹配: 
^  脫字符 :開頭或結(jié)尾
 -  范圍  : 開頭或結(jié)尾
 ]  閉括號 :必須放在開頭 []^] 、 [-^] 齿尽、[]-] 沽损、[]^-]
提示:匹配上面2個或三個
如何在中括號匹配這兩個字符
echo 'abcd-def' | grep '[-abcd]'  #放在開頭
echo 'abcd-d^ef' | grep '[^abcd^efda]'


正則表達(dá)式 \w \s \d \b 用法:
. 匹配除換行符以外的任意字符
\n 匹配換行
\t  匹配制表符號
\w 匹配字母或數(shù)字或下劃線 (a-zA-Z0-9_)
\W :匹配非單詞字符  [^a-zA-Z0-9_]
\s 匹配任意的空白符
\d 匹配數(shù)字                      等價于[0-9]
\D 匹配非數(shù)字字符
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束
. 表示任意單個字符
其中,[^A-Z]表示除了不包含大寫字母循头,^取反;^[A-Z]表示以大寫字母開頭
提示: 有些程序并不支持上面的反斜線轉(zhuǎn)義元字符绵估,例如gnu grep2.6 不支持 \s \d  ,grep 2.20支持\s 不支持\d , sed 不支持\d 
單詞: 在正則表達(dá)式中的含義卡骂,[^a-zA-Z0-9_]組成的字符或字符串都是單詞 例如 nihao, hello world_ 第一個nihao 第二個hello  第三個world_ 
示例:
[root@master ~]# echo 'abc def 1234' | grep '\s'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\S'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\w'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\W'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\s\w'
abc def 1234
# . 點匹配任意單個字符
echo "abc def 1234" | grep '.'
echo "abc def 1234" | grep 'a.'
1.2 中括號之字符類 
posix 定義好的字符類,請自行查找
還有語言支持非posix 字符類
 [:lower:]  : 等價a-z
 [:alnum:]  :代表了0-9A-Za-z  等價  [:lower:]+ [:upper:] +
                    [:digit:] 
 使用時:
 [[:alpha:]]  : 任意字符
echo '1234 helo world 學(xué),U)&)^&' | grep '[12[:alpha:]]

1.3 等價類和排序類 (只做了解)
[=x=] : 普通字符和帶有重音字符(一到四聲音)
[.xyz.] : 排序類 collating symbol 

#shell 中輸入制表符
ctrl+v+tab 

2 位置匹配(錨定) 
只匹配位置国裳,不匹配字符,不會消耗字符數(shù)量全跨,也稱為零寬斷言
^ 匹配行首
$ 匹配行尾
\< 匹配單詞開頭位置
\> 匹配單詞結(jié)尾位置
\b 匹配單詞邊界(開頭和結(jié)尾 \bword\b 等價 \<word\>
\B 非單詞邊界
示例:
echo "abc def 1234" | grep '.\>'
echo "abc def 1234" | grep '\b1234\b'
echo "abc def 1234" | grep '\B234'

#正則表達(dá)式的匹配過程缝左,
------ 消耗字符和交換字符的問題!
----某輪匹配成功浓若,消耗所有匹配成功字符
----某輪匹配失敗渺杉,消耗本輪匹配的首字符,剩余字符被交還

每一論正則的匹配挪钓,都需要從正則的第一個元素從頭開始匹配是越。
  # abc      "xaabcxyz"
     echo "aaaaa" | grep -o 'aa'   -o: 匹配過程

一輪匹配   
掃描第一個字符 ,和正則表達(dá)式的第一個元素進(jìn)行匹配
如果匹配失敗碌上,這一輪正則匹配失敗
二輪匹配  
掃描下一個字符倚评,從頭開始和正則表達(dá)式匹配
如果成功,則繼續(xù)掃描下一個字符和正則的下一個元素匹配
如果這個字符匹配失敗馏予,同一
交換除了第二輪匹配開始的首字符外所有字符
交換知乎天梧,從交換的第一個字符開始進(jìn)入下一輪匹配
第三輪:
如果匹配成功,則不交換匹配成功的字符
然后從匹配成功的下一個字符進(jìn)入下一輪匹配



3 量詞(重復(fù)匹配次數(shù)) 貪婪匹配
基礎(chǔ)正則表達(dá)式中霞丧,對于量詞的元字符需要加上反斜線轉(zhuǎn)義
結(jié)論: 量詞它是正則表達(dá)式中的隱含修飾符呢岗,它修飾的是前面一個字符或前面一個子表達(dá)式,它自身不是正則表達(dá)式中的獨立元素,量詞和它所修飾的字符或子表達(dá)式組合起來才是正則表達(dá)式中的獨立元素敷燎。

{m} 表示匹配前一個字符或前一個子表達(dá)式m 次
{m,n} 最少m次暂筝,最多n次
{m,}   至少m次
{,n}  最多n次  :有些語言不支持(perl 不支持)
         注意: 匹配0次也成功,只不過匹配的是空字符硬贯,但是grep 沒法顯示
? :0或1次 等價{0,1} {,1}
*  :0或多次  等價于{0,}  
    提示: .* 匹配任意字符焕襟、任意長度
                    而不是某個字符任意長度
                    星號是量詞
      ".*" : 3 3333 33333 abcdef (也能匹配) 
+ :1或多次   等價于 {1,}


示例: 
a{3} 匹配a 三次

#echo "aaaaa" | grep -E 'a{3}'
aaaaa
# echo "abc" | grep -E '[abc]{3}'

 [root@master ~]# echo "hello world" | grep -Eo '[a-z]{,4}'
hell
o
worl
d
[root@master ~]# echo "hello world" | sed -r 's/[0-9]{,4}/_/g'
_h_e_l_l_o_ _w_o_r_l_d_
#和上一條對比,理解匹配的過程
  匹配0次的也是有過程的

思考:量詞會出現(xiàn)大量的回溯饭豹,是正則表達(dá)式的性能殺手
echo "world2222222222" | grep -Eo '[0-9]{100}'
提示:匹配了55次鸵赖,性能問題 : 回溯(回頭匹配)
           如果有99個2呢 4950次回書

[root@master ~]# echo "abcdef" | grep -E 'a[b-f]*f'
abcdef
提示 :a 第一個元素  [b-f]* 是第二個元素 f 第三個元素
            f 在第二個元素中匹配中交回,匹配了最后一個

[root@master ~]# echo "abcdef" | grep -E 'a[b-c]*f' 無匹配的
 提示: 這個* 是和[] 中算一個整體

#實現(xiàn)非貪婪匹配
基礎(chǔ)正則和擴展正則都只支持貪婪匹配拄衰,不支持非貪婪匹配
示例:
[root@master ~]# grep '^m.*:' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
mysftp:x:1006:1006::/data/sftp/mysftp:/bin/false
#非貪婪
perl -nE 'say $& if /^m.*?:/' /etc/passwd

[root@master ~]# grep '^m[^:]*:' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
mysftp:x:1006:1006::/data/sftp/mysftp:/bin/false
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末它褪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翘悉,更是在濱河造成了極大的恐慌茫打,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妖混,死亡現(xiàn)場離奇詭異老赤,居然都是意外死亡,警方通過查閱死者的電腦和手機制市,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門抬旺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祥楣,你說我怎么就攤上這事开财。” “怎么了误褪?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵责鳍,是天一觀的道長。 經(jīng)常有香客問我兽间,道長薇搁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任渡八,我火速辦了婚禮,結(jié)果婚禮上传货,老公的妹妹穿的比我還像新娘屎鳍。我一直安慰自己,他們只是感情好问裕,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布逮壁。 她就那樣靜靜地躺著,像睡著了一般粮宛。 火紅的嫁衣襯著肌膚如雪窥淆。 梳的紋絲不亂的頭發(fā)上卖宠,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音忧饭,去河邊找鬼扛伍。 笑死,一個胖子當(dāng)著我的面吹牛词裤,可吹牛的內(nèi)容都是我干的刺洒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吼砂,長吁一口氣:“原來是場噩夢啊……” “哼逆航!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渔肩,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤因俐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后周偎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抹剩,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年栏饮,在試婚紗的時候發(fā)現(xiàn)自己被綠了吧兔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡袍嬉,死狀恐怖境蔼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伺通,我是刑警寧澤箍土,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站罐监,受9級特大地震影響吴藻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弓柱,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一沟堡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矢空,春花似錦航罗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春复亏,著一層夾襖步出監(jiān)牢的瞬間趾娃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工缔御, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抬闷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓刹淌,卻偏偏與公主長得像饶氏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子有勾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容