日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

正则表达式的简单认识

發布時間:2025/3/19 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则表达式的简单认识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文本搜索工具,根據用戶指定的"模式(pattern)"對目標文本進行過濾,顯示被模式匹配到的行。

一、什么是正則表達式?

正則表達式:由一類字符書寫的模式,其中有些字符不表示字符的字面意義,而是表示控制或通配的功能;

二、正則表達式元字符

正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。元字符使正則表達式具有處理能力。元字符既可以是放在 [] 中的任意單個字符(如 [a] 表示匹配單個小寫字符 a ),也可以是字符序列(如 [a-d] 表示匹配 a 、 b 、 c 、 d 之間的任意一個字符,而 \w 表示任意英文字母和數字及下劃線),下面是一些常見的元字符:??
.?? ?匹配除 \n 以外的任意單字符(注意元字符是小數點)。?
?
[abcde]??匹配 abcde 之中的任意一個字符?
?
[a-h]? ?匹配 a 到 h 之間的任意一個字符?
?
[^fgh]??不與 fgh 之中的任意一個字符匹配?
?
\w??匹配大小寫英文字符及數字 0 到 9 之間的任意一個及下劃線,相當于 [a-zA-Z0-9_]?
?
\W??不匹配大小寫英文字符及數字 0 到 9 之間的任意一個,相當于 [^a-zA-Z0-9_]?
?
\s??匹配任何空白字符,相當于 [ \f\n\r\t\v]?
?
\S??匹配任何非空白字符,相當于 [^\s]?
?
\d 匹配任何 0 到 9 之間的單個數字,相當于 [0-9]?
?
\D??不匹配任何 0 到 9 之間的單個數字,相當于 [^0-9]?
?
[\u4e00-\u9fa5]??匹配任意單個漢字(這里用的是 Unicode 編碼表示漢字的 )?

三、正則表達式的分類

1、grep及基本正則表達式

grep [OPTION]... 'PATTERN' FILE...

????????

字符匹配:

????????????. : 匹配任意單個字符

????????????[]: 匹配指定集合中的任意單個字符

????????????????[[:digit:]]===[0-9]

????????????????[[:lower:]]===[a-z]

????????????????[[:upper:]]===[A-Z]

????????????????[[:alpha:]]===[a-zA-Z]

????????????????[[:alnum:]]==[0-9a-zA-Z]

????????????????[[:space:]]

????????????????[[:punct:]]

????????????[^]: 匹配指定集合外的任意單個字符

????????匹配次數:用于對其前面緊鄰的字符所能夠出現的次數作出限定

????????????*: 匹配其前面的字符任意次,0,1或多次;

????????????????例如:grep 'x*y'

????????????????????xy, xxy, xxxy, y

????????????\?:匹配其前面的字符0次或1次;

????????????????例如:grep 'x\?y'

????????????????????xy, xxy, y, xxxxxy, aby

????????????\+: 匹配其前面的字符出現至少1次;

????????????\{m\}: 匹配其前面的字符m次;

????????????????例如:grep 'x\{2\}y'

????????????????????xy, xxy, y, xxxxxy, aby

????????????\{m,n\} 匹配其前面的字符至少m次,至多n次;

????????????????例如: grep 'x\{2,4\}y'

????????????????????????xy, xxy, y, xxxxxxy, aby

???????????????????? grep 'x\{0,4\}y'

???????????????????? ????xy, xxy, y, xxxxxxxxxy, aby

???????????????????? grep 'x\{2,\}y'

???????????????????? ????xy, xxy, y, xxxxxy

????????????.*: 匹配任意長度的任意字符

????????位置錨定

????????????^: 行首錨定

????????????????寫在模式的最左側

????????????$: 行尾錨定

????????????????寫在模式的最右側

????????????^$: 空白行

?

????????????\<: 詞首錨定, 相當于\b

????????????????出現在要查找的單詞模式的左側;\<char

????????????\>:詞尾錨定, 相當于\b

????????????????出現在要查找的單詞模式的右側;char\>

????????????\<pattern\>: 匹配單詞

????????分組:

????????????\(\)

????????????后向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式匹配到了某內容,此內容后面的模式中可以被引用;

????????????????\1, \2, \3

????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;

來個習題來形象的解釋后向引用

習題: 添加用戶bash, testbash, basher, nologin(SHELL為/sbin/nologin),而找出當前系統上其用戶名和默認shell相同的用戶;

?

????grep選項:

????????-v: 反向選取

????????-o: 僅顯示匹配到內容

????????-i: 忽略字符大小寫

????????-E: 使用擴展正則表達式

????????-A #:打印后#行的內容

????????-B #:打印前#行的內容

????????-C #:打印#行的輸出內容

2、egrep及其擴展正則表達式

egrep:egrep = grep -E 可以使用基本的正則表達外, 還可以用擴展表達式. 注意區別.
擴展表達式:

擴展正則表達式的元字符:

????????????字符匹配:

????????????????. : 匹配其任意單個字符

????????????????[]: 匹配指定集合中的任意單個字符

????????????????[^]:匹配指定集合外的任意單個字符

????????????匹配次數限定:

????????????????*:匹配其前面的字符任意次,0,1或多次;

?????????????????: 匹配其前面字符0次或1次;

????????????????+:匹配其前面的字符至少1次;

????????????????{m}:匹配其前面的字符m次;

????????????????{m,n}:{m,}表示匹配其前面至少m次, {0,n}表示匹配其前面之多n次;

????????????錨定:

????????????????^: 行首錨定

????????????????寫在模式的最左側

????????????$: 行尾錨定

????????????????寫在模式的最右側

????????????^$: 空白行

?

????????????\<: 詞首錨定, 相當于\b

????????????????出現在要查找的單詞模式的左側;\<char

????????????\>:詞尾錨定, 相當于\b

????????????????出現在要查找的單詞模式的右側;char\>

????????????\<pattern\>: 匹配單詞

????????分組:

????????????() ---------注意grep里的是用\(\)

????????????后向引用:模式中,如果使用()實現了分組,在某行文本的檢查中,如果()的模式匹配到了某內容,此內容后面的模式中可以被引用;

????????????????\1, \2, \3

????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;

????????????或者:

????????????????a|b: a或者b

????????????????ab|cd:

?

下面我來通過大量習題講解來進一步揭開grep與egrep的神秘面紗

習題

1、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;

????????????grep -i '^[s]'.* /proc/meminfo

????????????egrep ^[Ss].* /proc/meminfo

注釋:知識點 (1) 這里用到了^: 行首錨定
(2)
[]: 匹配指定集合中的任意單個 字符

(3)-i: 忽略字符大小寫

?

2、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;

????????????grep -v /sbin/nologin$ /etc/passwd

???????? egrep -v /sbin/nologin$ /etc/passwd

注釋:知識點 (1) -v: 反向選取

(2) $: 行尾錨定, 寫在模式的最右側

????????????????

3、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;進一步:僅顯示上述結果中其ID號最大的用戶;????

grep /bin/bash /etc/passwd|sort -n -r -t: -k3 | head -1

?

?

注釋:知識點 (1)sort [option…]

-n :按數值大小排序

-r :逆序

-t :指定字段以什么為分隔符

-k # :指定用于排序的第#字段

(2)head [options]

-n #或是-# :指定前#行

4、找出/etc/passwd文件中的一位數或兩位數;

???????????????? # egrep '\<([0-9]|[1-9][0-9])\>' /etc/passwd

注釋:知識點 (1) ????\<pattern\>: 匹配單詞

5、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;

#grep '^[[:space:]]\+' /boot/grub/grub.conf

#egrep '^[[:space:]]+' /boot/grub/grub.conf

?

注釋:知識點(1) 這里用到了^: 行首錨定
(2) ????[[:space:]] 匹配任意單個空白字符

(3) 在grep里\+:匹配其前面的字符至少1次;

(4) 在grep里\+:匹配其前面的字符至少1次;

6、顯示/etc/rc.d/rc.sysinit文件中,以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;

grep????'^#[[:space:]]\+[^[:space:]]\+' ????/etc/rc.d/rc.sysinit

注釋:知識點與第五題一樣

7、找出netstat -tan命令執行結果中以'LISTEN'(后可有空白字符)結尾的行;

netstat -tan | grep 'LISTEN[[:space:]]\+' --color=auto

注釋:知識點(1)netstat 命令用于顯示各種網絡相關信息

(2) | 為管道,連接命令,實現將前一個命令的輸出當作后一個命令的輸入;

(3) --color=auto 是增加顏色顯示

(4)其它可參照第五題

8、擴展題:新建一個文本文件,假設有如下內容:

????????????????He like his lover.

????????????????He love his lover.

????????????????He like his liker.

????????????????He love his liker.

????????????找出其中最后一個單詞是由此前某單詞加r構成的行。

?

????????????# grep '\(\<[[:alpha:]]\+\>\).*\1r' a.txt

????????????# egrep '(\<[[:alpha:]]+\>).*\1r' m.txt

注釋:知識點(1) \(\) ---grep的表示

????????????后向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式匹配到了某內容,此內容后面的模式中可以被引用;

????????????????\1, \2, \3

????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;

(2) () -------注意grep里的是用\(\)

????????????后向引用:模式中,如果使用()實現了分組,在某行文本的檢查中,如果()的模式匹配到了某內容,此內容后面的模式中可以被引用;

????????????????\1, \2, \3

????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;

9、顯示當前系統上root、centos或user1用戶的默認shell及用戶名;下面幾種表示方法

# cut -d: -f1,7 /etc/passwd | egrep ^'root|centos|user1'

# cut -d: -f1,7 /etc/passwd | egrep '^root|^centos|^user1'

# cut -d: -f1,7 /etc/passwd | egrep '^(root|centos|user1)'

如是有user10,則需要固定一個詞

# cut -d: -f1,7 /etc/passwd | egrep '^(root|centos|\<user1\>)'

注釋:知識點(1)cut option FILE…

-d 后邊指定字段分隔符

-f # |#-# |#,# 指定要顯示的字段(其中#表示第1段,#-#表示兩#區間內連續的段落,(#,#)表示只要兩個#段的本身)

(2)參照第五題的知識點

10、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一對小括號"()"的行;

#grep????'\<[[:alnum:]]\+\>()' /etc/rc.d/init.d/functions|cut -d' ' -f1

????#egrep????'\<[[:alnum:]]+\>\(\)' /etc/rc.d/init.d/functions|cut -d' ' -f1

注釋:知識點(1) [[:alnum:]]==[0-9a-zA-Z]

(2) 在grep里\+:匹配其前面的字符至少1次;

(3) 在grep里\+:匹配其前面的字符至少1次;

(4)在egrep里小括號()表示詞組引用,所以想表示小括號的原義需要轉義-- \(\)

11、使用echo輸出一個路徑,而使用egrep取出其基名;

???? #echo '/etc/sysconfig/' | egrep -o '[^/]+/?$'

注釋:知識點(1)基名(dirname):從文件名中去掉路徑信息,只打印

(2) -o: 僅顯示匹配到內容

(3) ?????: 匹配其前面字符0次或1次;

12、找出ifconfig命令結果中的1-255之間的數值;

???? 1.0.0.1 - 223.255.255.254

ifconfig | egrep '[0-9]|[1-9][0-9]|[1-9][0-9]{2}'

--color=auto

注釋:知識點(1)在egrep中

{m}:匹配其前面的字符m次;

13、找出ifconfig命令結果中的IP地址;

????ifconfig |egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>' --color=auto

注釋:知識點(1)四種顏色表示ip的四個段落,

(2)我們也可以簡化下,因為第二段和第三段一樣,效果如下:

ifconfig |egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>' --color=auto

轉載于:https://www.cnblogs.com/na2po2lun/p/4146652.html

總結

以上是生活随笔為你收集整理的正则表达式的简单认识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。