溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

UNIX/LINUX SHELL中正則表達(dá)式語(yǔ)法的示例分析

發(fā)布時(shí)間:2021-06-11 15:07:03 來(lái)源:億速云 閱讀:119 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要為大家展示了“UNIX/LINUX SHELL中正則表達(dá)式語(yǔ)法的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“UNIX/LINUX SHELL中正則表達(dá)式語(yǔ)法的示例分析”這篇文章吧。

幾乎所有重要問(wèn)題都需要從無(wú)用數(shù)據(jù)中過(guò)濾出有用數(shù)據(jù)。了解大量的 UNIX? 命令行實(shí)用工具如何使用正則表達(dá)式 來(lái)去蕪取精。
非常奇怪,直到今天我仍然能重復(fù)周六早上的經(jīng)典歌曲“Conjunction Junction”。這是好事(看了太多電視)還是壞事(也許是我現(xiàn)在職業(yè)的先兆)仍然有待討論。不管怎樣,這首小調(diào)在歡快的節(jié)奏下傳遞了基本的信息。

我還沒(méi)有為學(xué)習(xí) UNIX 構(gòu)想出與“Conjunction Junction”相似的作品,但是我會(huì)在未來(lái)的幾個(gè)月里嘗試親手編寫(xiě)這樣的歌曲。與此同時(shí),趁著快樂(lè)回憶所帶來(lái)的好心情,我們繼續(xù)以 Schoolhouse 搖滾的傳統(tǒng)學(xué)習(xí)方式攻克命令行。

現(xiàn)在開(kāi)始上課。吐出嘴里的口香糖,回到您的座位上,然后拿出一根二號(hào)鉛筆。還有您,Spicoli。

模仿秀

您可以將 UNIX 命令行看作是一句話:

  • 可執(zhí)行命令,如 cat 或 ls,是動(dòng)詞——操作。

  • 命令的輸出是名詞——要查閱或使用的數(shù)據(jù)。

  • Shell 操作符,如 |(管道)或 >(重定向標(biāo)準(zhǔn)輸出),是連詞——用于連接句子。

例如,命令行:ls -A | wc -l 用于計(jì)算當(dāng)前目錄下的條目數(shù)(忽略特殊條目 . 和 ..),它包含兩個(gè)句子。第一個(gè)句子 ls -A 是動(dòng)詞結(jié)構(gòu),列舉當(dāng)前目錄下的內(nèi)容,第二個(gè)句子 wc -l 是另一個(gè)動(dòng)詞結(jié)構(gòu),用于計(jì)算行數(shù)。第一個(gè)句子輸出的結(jié)果作為第二個(gè)句子的輸入,并由連接詞(管道)連接這兩個(gè)句子。

在本系列文章以及其他文章中展示的許多您可能已經(jīng)學(xué)習(xí)過(guò)的命令行句式都具有這種句子結(jié)構(gòu)。

但是,如果缺少了文法上的修飾語(yǔ),命令行將顯得不專(zhuān)業(yè)。當(dāng)然,基本句子也能完成工作,但是這樣顯得不優(yōu)美。(在此對(duì)高中英語(yǔ)演唱二人組 Rad 女士和 Perlstein 女士表示歉意。)解決更有趣的問(wèn)題需要用到形容詞。

幾乎所有重要問(wèn)題都需要從無(wú)用數(shù)據(jù)中過(guò)濾出有用數(shù)據(jù)。雖然屬性的數(shù)量和種類(lèi)會(huì)有所不同,但是每種方案都通過(guò)某種方式(形式或格式),隱式或顯式地描述了它要查找并處理的信息,從而生成另外一種形式的其他信息。

在命令行中,正則表達(dá)式 的作用相當(dāng)于形容詞——一種描述或限定詞。在應(yīng)用到輸出時(shí),正則表達(dá)式可辨別相關(guān)數(shù)據(jù)和無(wú)關(guān)數(shù)據(jù)。

標(biāo)點(diǎn)概述

讓我們看一個(gè)示例問(wèn)題。

grep 實(shí)用工具逐行過(guò)濾輸入并尋找匹配。grep 的最簡(jiǎn)單應(yīng)用是打印那些包含與某個(gè)模式匹配的文本的行。grep 可以查找具有固定順序的字符組合,甚至可以通過(guò)使用 -i 選項(xiàng)來(lái)忽略大小寫(xiě)。

因此,假定文件 heroes.txt 包含以下行:

Catwoman
Batman
The Tick
Spider Man
Black Cat
Batgirl
Danger Girl
Wonder Woman
Luke Cage
The Punisher
Ant Man
Dead Girl
Aquaman
SCUD
Spider Woman
Blackbolt
Martian Manhunter

命令行:

grep -i man heroes.txt

將生成:

Catwoman
Batman
Spider Man
Wonder Woman
Ant Man
Aquaman
Martian Manhunter

其中 grep 掃描 heroes.txt 文件中的每一行并查找字母 m,后面緊跟 a,然后緊跟 n。除了必須保證相鄰,這些字母可以出現(xiàn)在行的任何位置,甚至可以位于較大的單詞中間。在不考慮大小寫(xiě)的情況下(-i 選項(xiàng)),Catwoman、Batman、Spider Man、Wonder Woman、Ant Man、Aquaman 和 Martian Manhunter 都包含字符串 man。

grep 實(shí)用工具包含其他可優(yōu)化搜索的內(nèi)置選項(xiàng)。例如,-w 選項(xiàng)限制于匹配整個(gè)單詞,因此 grep -i -w man 將排除 Catwoman 和 Batman(舉例來(lái)說(shuō))。

該工具還有一個(gè)優(yōu)秀的功能,可以排除而不是包括所有匹配的搜索結(jié)果。使用 -v 選項(xiàng)來(lái)排除 匹配的行。例如:

grep -v -i 'spider' heroes.txt

將打印除了包含字符串 spider 之外的所有行。

Catwoman
Batman
The Tick
Black Cat
Batgirl
Danger Girl
Wonder Woman
Luke Cage
The Punisher
Ant Man
Dead Girl
Aquaman
SCUD
Blackbolt
Martian Manhunter

但是,對(duì)于以下這些情況,您該如何處理?只希望得到那些開(kāi)頭為“Bat”的單詞;或者以“bat”、“Bat”、“cat”或“Cat”開(kāi)頭的單詞?或者希望知道有多少漫畫(huà)復(fù)仇者的名字以“man”結(jié)束。在這些實(shí)例中,類(lèi)似于上述三個(gè)示例的簡(jiǎn)單字符串搜索將無(wú)法滿足要求,因?yàn)檫@些搜索不區(qū)分位置。

位置、位置、位置和備選項(xiàng)

正則表達(dá)式可以 過(guò)濾特定的位置,例如行的開(kāi)始或結(jié)束,以及單詞的開(kāi)始和結(jié)束。正則表達(dá)式(通常簡(jiǎn)寫(xiě)為 regex)還可以描述:備選項(xiàng)(您可將其稱(chēng)為“this”或“that”);固定長(zhǎng)度、可變長(zhǎng)度或不定長(zhǎng)度的重復(fù);范圍(例如,“a-m 之間的任意字母”);還有字符的類(lèi)別或種類(lèi)(“可打印字符”或“標(biāo)點(diǎn)符號(hào)”),以及其他技術(shù)。

表 1 顯示了一些常用的正則表達(dá)式操作符。您可以連接表 1 中顯示的元素(以及其他操作符)并加以組合使用,從而構(gòu)建(非常)復(fù)雜的正則表達(dá)式。

表 1. 常用的正則表達(dá)式操作符

操作符用途
.(句號(hào))匹配任意單個(gè)字符。
^(脫字號(hào))匹配出現(xiàn)在行首或字符串開(kāi)始位置的空字符串。
$(美元符號(hào))匹配出現(xiàn)在行末的空字符串。
A匹配大寫(xiě)字母 A。
a匹配小寫(xiě)字母 a。
/d匹配任意一位數(shù)字。
/D匹配任意單個(gè)非數(shù)字字符。
/w匹配任意單個(gè)字母數(shù)字字符,同義詞是 [:alnum:]。
[A-E]匹配任意大寫(xiě)的 A、B、C、D 或 E。
[^A-E]匹配除 A、B、C、D 和 E 之外的任意字符。
X?匹配出現(xiàn)零次或一次的大寫(xiě)字母 X。
X*匹配零個(gè)或任意個(gè)大寫(xiě) X。
X+匹配一個(gè)或多個(gè)字母 X。
X{n}精確匹配 n 個(gè)字母 X。
X{n,m}匹配最少 n 個(gè)并且不超過(guò) m 個(gè)字母 X。如果省略 m,表達(dá)式將嘗試匹配最少 n 個(gè) X。
(abc|def)+匹配一連串的(最少一個(gè)) abc 或 def;abc 和 def 將匹配。

以下是一些使用 grep 作為搜索工具的正則表達(dá)式示例。許多其他 UNIX 工具,包括交互式編輯器 vi 和 Emacs、流編輯器 sed 和 awk,以及所有現(xiàn)代編程語(yǔ)言都支持正則表達(dá)式。在您學(xué)會(huì)正則表達(dá)式的語(yǔ)法(也許相當(dāng)晦澀)之后,就可以將您的專(zhuān)業(yè)知識(shí)靈活運(yùn)用到不同的工具、編程語(yǔ)言和操作系統(tǒng)。

查找以“Bat”開(kāi)頭的名稱(chēng)

要查找以“Bat”開(kāi)頭的名稱(chēng),請(qǐng)使用:

grep -E '^Bat'

可以使用 -E 選項(xiàng)來(lái)指定正則表達(dá)式。^(脫字號(hào))字符匹配行首或字符串的開(kāi)頭,這是一個(gè)出現(xiàn)在每行或每個(gè)字符串開(kāi)頭字符之前的假想字符。字母 B、a 和 t 只具有字面含義并且僅匹配那些特定的字符。因此,命令 grep -E '^Bat' 將生成:

Batman
Batgirl

由于許多 regex 操作符也為 Shell 所使用(其中一些具有不同的用途,另外一些則有類(lèi)似的用途),因此一個(gè)好的習(xí)慣是使用單引號(hào)將命令行中的每個(gè) regex 括起來(lái),以保護(hù) regex 操作符免遭 Shell 的誤解。例如,*(星號(hào))和 $(美元符號(hào))都是 regex 操作符,并且對(duì)于您的 Shell 具有特殊的含義。

查找以“man”結(jié)尾的名稱(chēng)

要查找以“man”結(jié)尾的名稱(chēng),可以使用 regex man$ 來(lái)匹配序列 m、a 和 n,并且后面緊接與 regex 操作符 $ 匹配的行(字符串)。

查找空行

基于 ^ 和 $ 的作用,您可以使用 regex ^$ 來(lái)查找空行(相當(dāng)于在開(kāi)始之后立即結(jié)束的行)。

備選項(xiàng)或集合操作符

要查找以“bat”、“Bat”、“cat”或“Cat”開(kāi)頭的單詞,可以使用以下兩個(gè)技巧。首先是備選項(xiàng),如果備選項(xiàng)中的任意 模式匹配,都會(huì)產(chǎn)生匹配的結(jié)果。例如,命令:

grep -E '^(bat|Bat|cat|Cat)' heroes.txt

可實(shí)現(xiàn)這一技巧。regex 操作符 |(豎線)表示備選項(xiàng),因此 this|that 匹配字符串 this 或字符串 that。因此,^(bat|Bat|cat|Cat) 表示“行首緊跟 bat、Bat、cat 或 Cat之一?!碑?dāng)然,可以使用 grep -i 來(lái)簡(jiǎn)化該 regex,這樣可以忽略大小寫(xiě),從而將命令簡(jiǎn)化為:

grep -i -E '^(bat|cat)' heroes.txt

匹配“bat”、“Bat”、“cat”或“Cat”的另一個(gè)方法是使用 [ ](方括號(hào))集合 操作符。如果將一組字符放在一個(gè)集合中,則可以匹配那些字符中的任意一個(gè)。(您可以將集合 看作是字符備選項(xiàng)的簡(jiǎn)寫(xiě)法。)

例如,命令行:

grep -E '^[bcBC]at' heroes.txt

與以下命令生成的結(jié)果相同:

grep -E '^(bat|Bat|cat|Cat)' heroes.txt

您可以再次使用 -i 將 regex 簡(jiǎn)化為 ^[bc]at。

而且,還可以使用 -(連字符)操作符在集合中指定包含的字符范圍。例如,用戶名通常以字母開(kāi)頭。假定要在提交給您的服務(wù)器的 Web 表格中驗(yàn)證這樣的用戶名,可以使用類(lèi)似于 ^[A-Za-z] 的 regex。此 regex 表示“字符串的開(kāi)頭后緊跟任意大寫(xiě)字母 (A-Z) 或任意小寫(xiě)字母 (a-z)?!表槺阏f(shuō)明一下,[A-z] 與 [A-Za-z] 作用相同。

還可以在集合中混合使用范圍和單個(gè)字符。regex [A-MXYZ] 將匹配任意大寫(xiě)的 A-M、X、Y 和 Z。

并且,如果希望反轉(zhuǎn)集合(即排除集合中的任意字符),可以使用特殊集合 [^ ] 并包含要排除的范圍或字符。以下是反轉(zhuǎn)集合的示例。要查找所有名稱(chēng)中包含 at 的超級(jí)英雄,并排除 Dark Knight 和 Batman,請(qǐng)鍵入:

grep -i -E '[^b]at' heroes.txt

此命令生成:

Catwoman
Black Cat

由于某些集合需要經(jīng)常使用,所以設(shè)計(jì)出簡(jiǎn)化符號(hào)以代替大量字符。例如,集合 [A-z0-9_] 十分常用,因此可以簡(jiǎn)寫(xiě)為 /w。與此類(lèi)似,操作符 /W 是集合 [^A-z0-9_] 的簡(jiǎn)寫(xiě)。還可以使用符號(hào) [:alnum:] 代替 /w,使用 [^[:alnum:]] 代替 /W。

順便說(shuō)明一下,/w(以及同義詞 [:alnum:])是特定于區(qū)域的,而 [A-z0-9_] 即表示字母 A-z、數(shù)字 0-9 和下劃線。如果要開(kāi)發(fā)國(guó)際化應(yīng)用程序,請(qǐng)使用區(qū)域特定的格式以使代碼可以在許多區(qū)域之間移植。

跟我一起重復(fù):重復(fù),重復(fù),重復(fù)

到目前為止,已經(jīng)介紹了字面值、位置和兩種備選項(xiàng)操作符。僅使用這些內(nèi)容,就可以匹配大多數(shù)具有可預(yù)測(cè) 長(zhǎng)度的模式?,F(xiàn)在回到用戶名,通過(guò)以下 regex 命令可以確保每個(gè)用戶名以字母開(kāi)頭并緊跟恰好七個(gè)字母或數(shù)字:

[a-z][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]

但是這樣有點(diǎn)笨拙。而且,它只匹配恰好八個(gè)字符的用戶名。它不會(huì)匹配三到八個(gè)字符之間的名稱(chēng),這通常也是有效的用戶名。

正則表達(dá)式還可以包括重復(fù)修飾符。重復(fù)修飾符可以指定數(shù)量,如沒(méi)有、一個(gè)、多個(gè)、一個(gè)或多個(gè),零或一個(gè)、五到十個(gè),以及恰好三個(gè)。重復(fù)修飾符必須與其他模式組合,修飾符本身沒(méi)有含義。

例如,regex:

^[A-z][A-z0-9]{2,7}$

可以實(shí)現(xiàn)前面描述的用戶名過(guò)濾功能。用戶名 是以字母開(kāi)頭,后面緊跟至少兩個(gè),但不超過(guò)七個(gè)字母或數(shù)字的字符串,并且緊跟字符串結(jié)尾。

此處的位置定位點(diǎn)非常重要。如果沒(méi)有兩個(gè)位置操作符,則會(huì)錯(cuò)誤地接受任意長(zhǎng)度的用戶名。為什么呢?請(qǐng)考慮 regex:

^[A-z][A-z0-9]{2,7}

此命令辨別:字符串是否以字母開(kāi)頭并緊跟二到七個(gè)字母?但是它未提到終止條件。因此,字符串 samuelclemens 滿足條件,但是它的長(zhǎng)度顯然超出了有效用戶名的范圍。與此類(lèi)似,省略開(kāi)始定位點(diǎn) ^,或同時(shí)省略兩個(gè)定位點(diǎn)將分別匹配以類(lèi)似 munster1313 結(jié)束或包含該字符串的字符串。如果必須匹配特定的長(zhǎng)度,請(qǐng)記得在要求的模式的開(kāi)頭和結(jié)尾分別加上分隔符。

以下是其他一些示例:

  • 可以使用 {2,} 查找兩次或多次重復(fù)。regex ^G[o]{2,}gle 匹配 Google、Gooogle、Goooogle 等等。

  • 重復(fù)修飾符 ?、+ 和 * 分別查找零次或一次、一次或多次,以及零次或多次重復(fù)。(例如,您可以將 ? 看作是 {0,1} 的簡(jiǎn)寫(xiě)法。)

    regex boys? 匹配 boy 或 boys;regex Goo?gle 匹配 Gogle 或 Google。

    regex Goo+gle 匹配 Google、Gooogle、Goooogle 等等。

    construct Goo*gle 匹配 Gogle、Google、Gooogle 等等。

  • 可以將重復(fù)修飾符應(yīng)用到單個(gè)字符(如上所示),還可以應(yīng)用到更復(fù)雜的組合。使用 ( 和 ) 圓括號(hào)(就像數(shù)學(xué)中的用法)將修飾符應(yīng)用到子表達(dá)式。下面是一個(gè)示例:給定文本文件 test.txt:

The rain in Spain falls mainly
on the the plain.

It was the best of of times;
it was the worst of times.

命令 grep -i -E '(/b(of|the)/W+){2,}' test.txt 將生成:

on the the plain.
It was the best of of times;

regex 操作符 /b 匹配單詞邊界 或 (/W/w|/w/W)。該 regex 表示“一連串完整單詞‘the'或‘of'后面緊跟非文字字符。”您可能會(huì)提出疑問(wèn),為什么 /W+ 是必需的:/b 是位于單詞開(kāi)頭或結(jié)尾的空字符串。在單詞之間必須包括這一(或這些)字符,否則該 regex 將無(wú)法找到匹配。

捕獲需要注意的內(nèi)容

查找文本是常見(jiàn)的問(wèn)題,但是更常見(jiàn)的問(wèn)題則是希望在找到文本之后將其提取出來(lái)。換句話說(shuō),您希望去粗取精。

正則表達(dá)式通過(guò)捕獲 來(lái)提取信息。如果希望將需要的文本與其他內(nèi)容分開(kāi),請(qǐng)使用圓括號(hào)將模式括起來(lái)。實(shí)際上,您已經(jīng)使用圓括號(hào)收集術(shù)語(yǔ);在默認(rèn)情況下,圓括號(hào)自動(dòng)進(jìn)行捕獲。

要查看捕獲,請(qǐng)切換到 Perl。(grep 實(shí)用工具不支持捕獲,因?yàn)槠淠繕?biāo)是打印包含模式的行。)

以下命令:

perl -n -e '/^The/s+(.*)$/ && print "$1/n"' heroes.txt

將打?。?/p>

Tick
Punisher

使用命令 perl -e 可以直接從命令行運(yùn)行 Perl 程序。perl -n 命令針對(duì)輸入文件的每一行運(yùn)行一次程序。命令的 regex 部分,即位于斜杠之間的文本(/)表示“匹配字符串的開(kāi)頭,然后字母‘T'、‘h'、‘e'后緊跟一個(gè)或多個(gè)空格字符 /s+,然后捕獲直到字符串結(jié)尾的所有字符。

Perl 捕獲內(nèi)容被放在以 $1 開(kāi)頭的特殊 Perl 變量中。Perl 程序的其余部分打印捕獲的內(nèi)容。

每個(gè)嵌套的括號(hào)對(duì),從左開(kāi)始算起,每個(gè)左圓括號(hào)加一,放在下一個(gè)特殊的數(shù)字變量中。例如:

perl -n -e '/^(/w)+-(/w+)$/ && print "$1 $2"'

將生成:

Spider Man
Ant Man
Spider Woman

捕獲感興趣的文本僅僅是隔靴搔癢。如果能夠準(zhǔn)確確定材料,就可以使用其他材料改變其外觀。類(lèi)似于 vi 和 Emacs 的編輯器將模式匹配與替換組合,從而將查找和替換文本組合成一步操作。還可以使用模式、替換和 sed 從命令行更改文本。

豐富的主題

正則表達(dá)式非常強(qiáng)大;可供使用的操作符的數(shù)量龐大,種類(lèi)繁多。它包含如此豐富的信息和實(shí)踐知識(shí),我們?cè)谶@里所能列舉的實(shí)屬鳳毛麟角。

幸運(yùn)的是,有以下三種優(yōu)秀的正則表達(dá)式理論來(lái)源可供使用:

  • 如果在您的系統(tǒng)上有 Perl,可以參閱 Perl Regular Expression man 頁(yè)面(鍵入 perldoc perlre)。它會(huì)提供 regex 的精彩介紹,并包含許多有用的示例。許多編程語(yǔ)言都已采用 Perl 兼容的正則表達(dá)式 (PCRE),因此您在此 man 頁(yè)面讀到的內(nèi)容已被直接轉(zhuǎn)換到 PHP、Python、Java? 和 Ruby 編程語(yǔ)言,以及許多其他最新工具。

  • Jeffrey Friedl 編著的《正則表達(dá)式》(第三版)被認(rèn)為是 regex 用法方面的圣經(jīng)。該書(shū)細(xì)致、準(zhǔn)確、清晰、務(wù)實(shí)地說(shuō)明了匹配的工作方式、所有的 regex 操作符、多數(shù)優(yōu)先性(限制 + 和 * 匹配字符的數(shù)量),以及更多內(nèi)容。此外,F(xiàn)riedl 的書(shū)還包括一些令人驚嘆的正則表達(dá)式,可以準(zhǔn)確地匹配完全限定的電子郵件地址和其他 Request for Comments (RFC) 特定的字符串。

  • Nathan Good 編著的 Regular Expression Recipes 一書(shū)提供了針對(duì)許多常見(jiàn)數(shù)據(jù)處理和過(guò)濾問(wèn)題的有用的解決方案。如果需要提取郵政編碼、電話號(hào)碼或引用的字符串,請(qǐng)嘗試 Nathan 的解決方案。

在命令行中,可以采用許多方法使用正則表達(dá)式。幾乎每個(gè)處理文本的命令都支持某種形式的正則表達(dá)式。大多數(shù) Shell 命令語(yǔ)法還或多或少地?cái)U(kuò)展正則表達(dá)式以匹配文件名(盡管操作符的功能可能有所不同)。

例如,鍵入 ls [a-c] 以查找名為 a、b 或 c 的文件。鍵入 ls [a-c]* 以查找以 a、b 或 c 開(kāi)頭的所有文件名。此處的 * 在 Shell 中不像 grep 的解釋器那樣修飾 [a-c],* 被解釋為 .*。? 操作符在 Shell 中也可以工作,但是被解釋為 .,即匹配任意單個(gè)字符。

查看您最喜歡的實(shí)用工具或 Shell 的文檔以確定哪些 regex 操作符受支持,以及操作符可能具有的獨(dú)特性。

Unix grep正則表達(dá)式元字符

一個(gè)正則表達(dá)式就是由普通字符(例如字符 a 到 z)以及特殊字符(稱(chēng)為元字符)組成的文字模式。該模式描述在查找文字主體時(shí)待匹配的一個(gè)或多個(gè)字符串。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。
/

將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè) 后向引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,'n' 匹配字符 "n"。'/n' 匹配一個(gè)換行符。序列 '//' 匹配 "/" 而 "/(" 則匹配 "("。
^
匹配輸入字符串的開(kāi)始位置。
$
匹配輸入字符串的結(jié)束位置。
*
匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等價(jià)于{0,}。
+
匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價(jià)于 {1,}。
?
匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價(jià)于 {0,1}。
{n}
n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個(gè) o。
{n,}
n 是一個(gè)非負(fù)整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價(jià)于 'o+'。'o{0,}' 則等價(jià)于 'o*'。
{n,m}
m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o。'o{0,1}' 等價(jià)于 'o?'。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。
?
當(dāng)該字符緊跟在任何一個(gè)其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串 "oooo",'o+?' 將匹配單個(gè) "o",而 'o+' 將匹配所有 'o'。
.
匹配除 "/n" 之外的任何單個(gè)字符。要匹配包括 '/n' 在內(nèi)的任何字符,請(qǐng)使用象 '[./n]' 的模式。
(pattern)
匹配pattern 并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中則使用 $0…$9 屬性。要匹配圓括號(hào)字符,請(qǐng)使用 '/(' 或 '/)'。
(?:pattern)
匹配 pattern 但不獲取匹配結(jié)果,也就是說(shuō)這是一個(gè)非獲取匹配,不進(jìn)行存儲(chǔ)供以后使用。這在使用 "或" 字符 (|) 來(lái)組合一個(gè)模式的各個(gè)部分是很有用。例如, 'industr(?:y|ies) 就是一個(gè)比 'industry|industries' 更簡(jiǎn)略的表達(dá)式。
(?=pattern)
正向預(yù)查,在任何匹配 pattern 的字符串開(kāi)始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說(shuō),該匹配不需要獲取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開(kāi)始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開(kāi)始。
(?!pattern)
負(fù)向預(yù)查,在任何不匹配N(xiāo)egative lookahead matches the search string at any point where a string not matching pattern 的字符串開(kāi)始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說(shuō),該匹配不需要獲取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開(kāi)始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開(kāi)始。
x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
[xyz]
字符集合。匹配所包含的任意一個(gè)字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]
負(fù)值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]
字符范圍。匹配指定范圍內(nèi)的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范圍內(nèi)的任意小寫(xiě)字母字符。
[^a-z]
負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范圍內(nèi)的任意字符。
/b
匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
/B
匹配非單詞邊界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
/cx
匹配由x指明的控制字符。例如, /cM 匹配一個(gè) Control-M 或回車(chē)符。 x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個(gè)原義的 'c' 字符。
/d
匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]。
/D
匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]。
/f
匹配一個(gè)換頁(yè)符。等價(jià)于 /x0c 和 /cL。
/n
匹配一個(gè)換行符。等價(jià)于 /x0a 和 /cJ。
/r
匹配一個(gè)回車(chē)符。等價(jià)于 /x0d 和 /cM。
/s
匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ /f/n/r/t/v]。
/S
匹配任何非空白字符。等價(jià)于 [^ /f/n/r/t/v]。
/t
匹配一個(gè)制表符。等價(jià)于 /x09 和 /cI。
/v
匹配一個(gè)垂直制表符。等價(jià)于 /x0b 和 /cK。
/w
匹配包括下劃線的任何單詞字符。等價(jià)于'[A-Za-z0-9_]'。
/W
匹配任何非單詞字符。等價(jià)于 '[^A-Za-z0-9_]'。
/xn
匹配 n,其中 n 為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長(zhǎng)。例如, '/x41' 匹配 "A"。'/x041' 則等價(jià)于 '/x04' & "1"。正則表達(dá)式中可以使用 ASCII 編碼。.
/num
匹配 num,其中 num 是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。例如,'(.)/1' 匹配兩個(gè)連續(xù)的相同字符。
/n
標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)后向引用。如果 /n 之前至少 n 個(gè)獲取的子表達(dá)式,則 n 為后向引用。否則,如果 n 為八進(jìn)制數(shù)字 (0-7),則 n 為一個(gè)八進(jìn)制轉(zhuǎn)義值。
/nm
標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)后向引用。如果 /nm 之前至少有is preceded by at least nm 個(gè)獲取得子表達(dá)式,則 nm 為后向引用。如果 /nm 之前至少有 n 個(gè)獲取,則 n 為一個(gè)后跟文字 m 的后向引用。如果前面的條件都不滿足,若 n 和 m 均為八進(jìn)制數(shù)字 (0-7),則 /nm 將匹配八進(jìn)制轉(zhuǎn)義值 nm。
/nml
如果 n 為八進(jìn)制數(shù)字 (0-3),且 m 和 l 均為八進(jìn)制數(shù)字 (0-7),則匹配八進(jìn)制轉(zhuǎn)義值 nml。
/un
匹配 n,其中 n 是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的 Unicode 字符。例如, /u00A9 匹配版權(quán)符號(hào) (?)。

以上是“UNIX/LINUX SHELL中正則表達(dá)式語(yǔ)法的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI