正規表示式基礎

2021-09-09 06:08:50 字數 2660 閱讀 3055

正規表示式(簡寫為 regex 或者 regexp)基本上是定義一種搜尋模式的字串,可以被用來執行「搜尋」或者「搜尋並替換」操作,也可以被用來驗證像密碼策略等條件。

正規表示式是乙個我們可利用的非常強大的工具,並且使用正規表示式的優點是它能在幾乎所有計算機語言中被使用。所以如果你使用 bash 指令碼或者建立乙個 python 程式時,我們可以使用正規表示式,或者也可以寫乙個單行搜尋查詢。

在這篇教程中,我們將會學習一些正規表示式的基本概念,並且學習如何在 bash 中通過 grep 使用它們,但是如果你希望在其他語言如 python 或者 c 中使用它們,你只能使用正規表示式部分。那麼讓我們通過正規表示式的乙個例子開始吧,

正規表示式看起來像 /t[aeiou]l/ 這個樣子。

但這是什麼意思呢?它意味著所提到的正規表示式將尋找乙個詞,它以 t 開始,在中間包含字母 aeiou 中任意乙個,並且字母 l 最為最後乙個字元。它可以是 tel,tal 或者 til,可以匹配乙個單獨的詞或者其它單詞像 tilt,brutal 或者 telephone 的一部分。

grep 使用正規表示式的語法是 $ grep "regex_search_term" file_location

如果不理解,不要擔心,這只是乙個例子,來展示可以利用正規表示式獲取什麼,相信我,這是最簡單的例子。我們可以從正規表示式中獲取更多。現在我們將從正規表示式基礎的開始。

基礎的正規表示式

現在我們開始學習一些被稱為元字元的特殊字元。它們可以幫助我們建立更複雜的正規表示式搜尋項。下面提到的是基本元字元的列表:

. 點將匹配任意字元

[ ] 將匹配乙個字元範圍

[^ ] 將匹配除了括號中提到的那個之外的所有字元

* 將匹配零個或多個前面的項

+ 將匹配乙個或多個前面的項

? 將匹配零個或乙個前面的項

將匹配 n 次前面的項

將匹配 n 次或更多前面的項

將匹配在 n 和 m 次之間的項

將匹配少於或等於 m 次的項

\ 是乙個轉義字元,當我們需要在我們的搜尋中包含乙個元字元時使用

現在我們將用例子討論所有這些元字元。

. (點)

它用於匹配出現在我們搜尋項中的任意字元。舉個例子,我們可以使用點如:

$ grep "d.g" file1

這個正規表示式意味著我們在名為 『file1』 的檔案中查詢的詞以 d 開始,以 g結尾,中間可以有 1 個字元的字串。同樣,我們可以使用任意數量的點作為我們的搜尋模式,如 t......h,這個查詢項將查詢乙個詞,以 t 開始,以 h 結尾,並且中間可以有任意 6 個字元。

方括號用於定義字元範圍。例如,我們需要搜尋一些特別的單詞而不是匹配任何字元,

$ grep "n[oen]n" file2

這裡,我們正尋找乙個單詞,以 n開頭,以 n 結尾,並且中間只能有 o、e 或者 n 中的乙個。在方括號中我們可以提到單個到任意數量的字元。

我們在方括號中也可以定義像 a-e或者 1-18 作為匹配字元的列表。

這就像正規表示式的 not 操作。當使用 [^ ] 時,它意味著我們的搜尋將包括除了方括號內提到的所有字元。例如,

$ grep "st[^1-9]d" file3

這意味著我們可以擁有所有這樣的單詞,它們以 st 開始,以字母 d 結尾,並且不得包含從 1 到 9 的任何數字。

到現在為止,我們只使用了僅需要在中間查詢單個字元的正規表示式的例子,但是如果我們需要更多字元該怎麼辦呢。假設我們需要找到以乙個字元開頭和結尾的所有單詞,並且在中間可以有任意數量的字元。這就是我們使用乘數元字元如 + * 與 ? 的地方。

、、 或者 也是可以在我們的正規表示式項中使用的其他乘數元字元。

* (星號)

以下示例匹配字母 k 的任意出現次數,包括一次沒有:

$ grep "lak*" file4

它意味著我們可以匹配到 lake、la 或者 lakkkk。

以下模式要求字串中的字母 k 至少被匹配到一次:

$ grep "lak+" file5

這裡 k 在我們的搜尋中至少需要發生一次,所以我們的結果可以為 lake 或者 lakkkk,但不能是 la。

在以下模式匹配中

$ grep "ba?b" file6

匹配字串 bb 或 bab,使用 ? 乘數,我們可以有乙個或零個字元的出現。

非常重要的提示

當使用乘數時這是非常重要的,假設我們有乙個正規表示式

$ grep "s.*l" file7

我們得到的結果是 small、silly,並且我們也得到了 shane is a little to play ball。但是為什麼我們得到了 shane is a little to play ball?我們只是在搜尋中尋找單詞,為什麼我們得到了整個句子作為我們的輸出。

這是因為它滿足我們的搜尋標準,它以字母 s 開頭,中間有任意數量的字元並以字母 l 結尾。那麼,我們可以做些什麼來糾正我們的正規表示式來只是得到單詞而不是整個句子作為我們的輸出。

我們在正規表示式中需要增加 ? 元字元,

$ grep "s.*?l" file7

這將會糾正我們正規表示式的行為。

\ 是當我們需要包含乙個元字元或者對正規表示式有特殊含義的字元的時候來使用。例如,我們需要找到所有以點結尾的單詞,所以我們可以使用:

$ grep "s.*\\." file8

這將會查詢和匹配所有以乙個點字元結尾的詞。

正規表示式 1 正規表示式基礎

1.正規表示式基礎 正規表示式描述了一種字串匹配的模式,即可以使使用者通過一系列普通字元或特殊字元構建能夠明確描述文字字串的匹配模式,可以用來檢查某個字串是否含有某種子字串,將匹配的子字串做替換或者從某個字串中取出符合某個條件的子字串等。1.1 正規表示式的基本結構 乙個正規表示式就是由普通字元 如...

正規表示式基礎

限定符 d 匹配非負整數 正整數 0 0 9 1 9 0 9 匹配正整數 d 0 匹配非正整數 負整數 0 0 9 1 9 0 9 匹配負整數 d 匹配整數 d d 匹配非負浮點數 正浮點數 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 匹配正浮點數 d...

正規表示式基礎

元字元 描述 匹配任何單個字元。例如正規表示式r.t匹配這些字串 rat rut r t,但是不匹配root。匹配行結束符。例如正規表示式weasel 能夠匹配字串 he s a weasel 的末尾,但是不能匹配字串 they are a bunch of weasels.匹配一行的開始。例如正規...