正則表達式與通配符


 

 

POSIX 規范

  Portable Operating System Interface for uniX
  定義了 UNIX 操作系統應當支持的功能

  包括:

BRE(Basic Regular Expression,基本型正則表達式)
GNU 也對 BRE 做了擴展也支持 『(』、『)』、『{』、『}』、『+』、『?』、『|』 但是需要轉義
命令:grep、vi、sed

ERE(Extended Regular Express,擴展型正則表達式)
雖然 BRE 名為“基本”而 ERE 名為“擴展”,但 ERE 並不要求兼容 BRE 的語法,而是自成一體。因此其中的元字符不用轉義(在元字符之前添加反斜線會取消其特殊含義)
『(』、『)』、『{』、『}』、『+』、『?』、『|』 不需要轉義
命令:egrep、awk

 

幾種 POSIX 流派的說明

流派

說明

工具

BRE

(、)、{、}都必須轉義使用,不支持 +、?、|

grep、sed、vi(但 vi 支持這些多選結構和反向引用)

GNU BRE

(、)、{、}、+、?、|都必須轉義使用

GNU grep、GNU sed

ERE

元字符不必轉義,+、?、(、)、{、}、|可以直接使用,\1、\2 的支持不確定

egrep、awk

GNU ERE

元字符不必轉義,+、?、(、)、{、}、|可以直接使用,支持\1、\2

grep –E、GNU awk

 

 

常用 Linux/Unix 工具中的表示法

    

PCRE 記法

vi/vim

grep

awk

sed

*

*

*

*

*

+

\+

\+

+

\+

?

\=

\?

?

\?

{m,n}

\{m,n}

\{m,n\}

{m,n}

\{m,n\}

\b *

\< \>

\< \>

\< \>

\y \< \>

(…|…)

…‖…

…‖…

(…|…)

(…|…)

(…)

(…)

(…)

\1 \2

\1 \2

\1 \2

不支持

\1 \2

 

       常見3中類型正則表達式比較

  

字符

說明

Basic RegEx

Extended RegEx

python RegEx

Perl regEx

轉義

 

\

\

\

\

^

匹配行首,例如'^dog'匹配以字符串dog開頭的行(注意:awk 指令中,'^'則是匹配字符串的開始)

^

^

^

^

$

匹配行尾,例如:'^、dog$'匹配以字符串 dog 為結尾的行(注意:awk 指令中,'$'則是匹配字符串的結尾)

$

$

$

$

^$

匹配空行

^$

^$

^$

^$

^string$

匹配行,例如:'^dog$'匹配只含一個字符串 dog 的行

^string$

^string$

^string$

^string$

\<

匹配單詞,例如:'\<frog' (等價於'\bfrog'),匹配以 frog 開頭的單詞

\<

\<

不支持

不支持(但可以使用\b來匹配單詞,例如:'\bfrog')

\>

匹配單詞,例如:'frog\>'(等價於'frog\b '),匹配以 frog 結尾的單詞

\>

\>

不支持

不支持(但可以使用\b來匹配單詞,例如:'frog\b')

\<x\>

匹配一個單詞或者一個特定字符,例如:'\<frog\>'(等價於'\bfrog\b')、'\<G\>'

\<x\>

\<x\>

不支持

不支持(但可以使用\b來匹配單詞,例如:'\bfrog\b'

()

匹配表達式,例如:不支持'(frog)'

不支持(但可以使用\(\),如:\(dog\)

()

()

()

\(\)

匹配表達式,例如:不支持'(frog)'

\(\)

不支持(同())

不支持(同())

不支持(同())

匹配前面的子表達式 0 次或 1 次(等價於{0,1}),例如:where(is)?能匹配"where" 以及"whereis"

不支持(同\?)

\?

匹配前面的子表達式 0 次或 1 次(等價於'\{0,1\}'),例如:'where\(is\)\? '能匹配 "where"以及"whereis"

\?

不支持(同?)

不支持(同?)

不支持(同?)

?

當該字符緊跟在任何一個其他限制符(*, +, ?, {n},{n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對於字符串 "oooo",'o+?' 將匹配單個"o",而 'o+' 將匹配所有 'o'

不支持

不支持

不支持

不支持

.

匹配除換行符('\n')之外的任意單個字符(注意:awk 指令中的句點能匹配換行符)

.

.(如果要匹配包括“\n”在內的任何一個字符,請使用:'(^$)|(.)

.

.(如果要匹配包括“\n”在內的任何一個字符,請使用:' [.\n] '

*

匹配前面的子表達式 0 次或多次(等價於{0, }),例如:zo* 能匹配 "z"以及 "zoo"

*

*

*

*

\+

匹配前面的子表達式 1 次或多次(等價於'\{1, \}'),例如:'where\(is\)\+ '能匹配 "whereis"以及"whereisis"

\+

不支持(同+)

不支持(同+)

不支持(同+)

+

匹配前面的子表達式 1 次或多次(等價於{1, }),例如:zo+能匹配 "zo"以及 "zoo",但不能匹配 "z"

不支持(同\+)

+

+

+

{n}

n 必須是一個 0 或者正整數,匹配子表達式 n 次,例如:zo{2}能匹配

不支持(同\{n\})

{n}

{n}

{n}

{n,}

"zooz",但不能匹配 "Bob"n 必須是一個 0 或者正整數,匹配子表達式大於等於 n次,例如:go{2,}

不支持(同\{n,\})

{n,}

{n,}

{n,}

{n,m}

能匹配 "good",但不能匹配 godm 和 n 均為非負整數,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}將配"fooooood" 中的前三個 o(請注意在逗號和兩個數之間不能有空格)

不支持(同\{n,m\})

{n,m}

{n,m}

{n,m}

x|y

匹配 x 或 y,例如: 不支持'z|(food)' 能匹配 "z" 或"food";'(z|f)ood' 則匹配"zood" 或 "food"

不支持(同x\|y)

x|y

x|y

x|y

[0-9]

匹配從 0 到 9 中的任意一個數字字符(注意:要寫成遞增)

[0-9]

[0-9]

[0-9]

[0-9]

[xyz]

字符集合,匹配所包含的任意一個字符,例如:'[abc]'可以匹配"lay" 中的 'a'(注意:如果元字符,例如:. *等,它們被放在[ ]中,那么它們將變成一個普通字符)

[xyz]

[xyz]

[xyz]

[xyz]

[^xyz]

負值字符集合,匹配未包含的任意一個字符(注意:不包括換行符),例如:'[^abc]' 可以匹配 "Lay" 中的'L'(注意:[^xyz]在awk 指令中則是匹配未包含的任意一個字符+換行符)

[^xyz]

[^xyz]

[^xyz]

[^xyz]

[A-Za-z]

匹配大寫字母或者小寫字母中的任意一個字符(注意:要寫成遞增)

[A-Za-z]

[A-Za-z]

[A-Za-z]

[A-Za-z]

[^A-Za-z]

匹配除了大寫與小寫字母之外的任意一個字符(注意:寫成遞增)

[^A-Za-z]

[^A-Za-z]

[^A-Za-z]

[^A-Za-z]

\d

匹配從 0 到 9 中的任意一個數字字符(等價於 [0-9])

不支持

不支持

\d

\d

\D

匹配非數字字符(等價於 [^0-9])

不支持

不支持

\D

\D

\S

匹配任何非空白字符(等價於[^\f\n\r\t\v])

不支持

不支持

\S

\S

\s

匹配任何空白字符,包括空格、制表符、換頁符等等(等價於[ \f\n\r\t\v])

不支持

不支持

\s

\s

\W

匹配任何非單詞字符 (等價於[^A-Za-z0-9_])

\W

\W

\W

\W

\w

匹配包括下划線的任何單詞字符(等價於[A-Za-z0-9_])

\w

\w

\w

\w

\B

匹配非單詞邊界,例如:'er\B' 能匹配 "verb" 中的'er',但不能匹配"never" 中的'er'

\B

\B

\B

\B

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置,例如: 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的'er'

\b

\b

\b

\b

\t

匹配一個橫向制表符(等價於 \x09和 \cI)

不支持

不支持

\t

\t

\v

匹配一個垂直制表符(等價於 \x0b和 \cK)

不支持

不支持

\v

\v

\n

匹配一個換行符(等價於 \x0a 和\cJ)

不支持

不支持

\n

\n

\f

匹配一個換頁符(等價於\x0c 和\cL)

不支持

不支持

\f

\f

\r

匹配一個回車符(等價於 \x0d 和\cM)

不支持

不支持

\r

\r

\\

匹配轉義字符本身"\"

\\

\\

\\

\\

\cx

匹配由 x 指明的控制字符,例如:\cM匹配一個Control-M 或回車符,x 的值必須為A-Z 或 a-z 之一,否則,將 c 視為一個原義的 'c' 字符

不支持

不支持

 

\cx

\xn

匹配 n,其中 n 為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長,例如:'\x41' 匹配 "A"。'\x041' 則等價於'\x04' & "1"。正則表達式中可以使用 ASCII 編碼

不支持

不支持

 

\xn

\num

匹配 num,其中 num是一個正整數。表示對所獲取的匹配的引用

不支持

\num

\num

 

[:alnum:]

匹配任何一個字母或數字([A-Za-z0-9]),例如:'[[:alnum:]] '

[:alnum:]

[:alnum:]

[:alnum:]

[:alnum:]

[:alpha:]

匹配任何一個字母([A-Za-z]), 例如:' [[:alpha:]] '

[:alpha:]

[:alpha:]

[:alpha:]

[:alpha:]

[:digit:]

匹配任何一個數字([0-9]),例如:'[[:digit:]] '

[:digit:]

[:digit:]

[:digit:]

[:digit:]

[:lower:]

匹配任何一個小寫字母([a-z]), 例如:' [[:lower:]] '

[:lower:]

[:lower:]

[:lower:]

[:lower:]

[:upper:]

匹配任何一個大寫字母([A-Z])

[:upper:]

[:upper:]

[:upper:]

[:upper:]

[:space:]

任何一個空白字符: 支持制表符、空格,例如:' [[:space:]] '

[:space:]

[:space:]

[:space:]

[:space:]

[:blank:]

空格和制表符(橫向和縱向),例如:'[[:blank:]]'ó'[\s\t\v]'

[:blank:]

[:blank:]

[:blank:]

[:blank:]

[:graph:]

任何一個可以看得見的且可以打印的字符(注意:不包括空格和換行符等),例如:'[[:graph:]] '

[:graph:]

[:graph:]

[:graph:]

[:graph:]

[:print:]

任何一個可以打印的字符(注意:不包括:[:cntrl:]、字符串結束符'\0'、EOF 文件結束符(-1), 但包括空格符號),例如:'[[:print:]] '

[:print:]

[:print:]

[:print:]

[:print:]

[:cntrl:]

任何一個控制字符(ASCII 字符集中的前 32 個字符,即:用十進制表示為從 0 到31,例如:換行符、制表符等等),例如:' [[:cntrl:]]'

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:punct:]

任何一個標點符號(不包括:[:alnum:]、[:cntrl:]、[:space:]這些字符集)

[:punct:]

[:punct:]

[:punct:]

[:punct:]

[:xdigit:]

任何一個十六進制數(即:0-9,a-f,A-F)

[:xdigit:]

[:xdigit:]

[:xdigit:]

[:xdigit:]

 

 通配符

  文本過濾工具里,都是用正則表達式, awk,sed,grep

  通配符多用在文件名上, ls find ,cp

  

通配符是先解釋,再執行
通配符不匹配,會原樣輸出
只適用於單層路徑
可用於文件名

 

 

?字符代表單個字符
*代表任意數量的字符
[...]匹配方括號之中的任意一個字符,比如[aeiou]可以匹配五個元音字母。
[start-end]表示一個連續的范圍
[^...]和[!...]表示匹配不在方括號里面的字符(不包括空字符)。這兩種寫法是等價的
{...} 表示匹配大括號里面的所有模式,模式之間使用逗號分隔
{start..end}會匹配連續范圍的字符。

 

 

  http://www.ruanyifeng.com/blog/2018/09/bash-wildcards.html

 

https://www.infoq.cn/article/2011/07/regular-expressions-6-POSIX

https://www.cnblogs.com/lixuwu/p/7816335.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM