正規表示式

2022-06-21 07:06:09 字數 3441 閱讀 7204

在檔案命令中經常會使用pattern正規表示式,它是可以描述一類字串的模式(pattern),如果乙個字串可以用某個正規表示式來描述,就稱這個字元和該正規表示式匹配。這和dos中使用者可以使用萬用字元「*」代表任意字元類似。在linux系統上,正規表示式通常被用來查詢文字的模式,以及對文字執行「搜尋-替換」操作等。

雖然正規表示式多年來在工具與unix版本上不斷在變化,但posix標準僅提供兩種正規表示式。你可以利用標準的庫程式進行模式匹配的工作。這樣就可以編寫出專用的工具程式,用於與grep一致的正規表示式(posix稱之為基本型正規表示式,basic regular expressions,bre),或是用於與egrep一致的正規表示式(posix稱之為擴充套件型正規表示式,extended regular expressions,ere)。

bre和ere都支援的字元:

\:忽略正規表示式中特殊字元的原有含義,有時則是相反地開啟後續字元的特殊含義。

.:匹配任何單個字元,但nul除外。==>匹配字元

如tol.toy表示一行中,含有tol這3個字母,加上任何乙個字元,再接著toy這3個字母。

*:匹配在它之前的任何數目(或沒有)的單個字元,即「匹配0個或多個前面的單個字元」。以ere而言,此前置字元可以是正規表示式,例如:因為.表示任一字元,所以".*"代表「匹配任一字元的任意長度」。

以bre來說,*若置於正規表示式的第乙個字元,不具有任何意義。  ==>匹配數目

如tol.*toy表示一行中含有tol這3個字母,加上任意的0或多個字元,再繼續toy這3個字母(例如toltoy,tolstory,tolwhotoy)。

^:匹配正規表示式的行首或字串起始,bre:僅在正規表示式的開頭處具有特殊含義,ere:置於正規表示式的任何位置都具有特殊含義。如bre下ab^cd中^表示的就是本身。

$:匹配正規表示式的行尾或字串尾,bre:僅在正規表示式的結尾處具有特殊含義,ere:置於正規表示式的任何位置都具有特殊含義。如bre下ab$cd中$表示的就是本身。

^$用來匹配空的字串或行列。

:方括號表示式(bracket expression),匹配方括號內的任一字元。

[-]:連續字元的範圍,如[a-z],即a、b、c一直到z都符合要求;^符號置於方括號裡第乙個字元則有反向含義,匹配不在方括號內的任意乙個字元。

僅bre支援的的meta字元(特殊字元):

\: 區間表示式,匹配在它前面的單個字元重現的次數區間。\指的是重現n次;\則為至少重現n次,而\為重現n至m次。n與m的值必須介於0至re_dup_max(含)之間,後者最小為255。

\( \): 反向引用。將\(與\)間的模式儲存在特殊的「保留空間(holding space)」。最多可以將9個獨立的子模式(subpattern)儲存在單個模式中。匹配於子模式的文字,可以通過轉義序列(escape sequences)\1至\9被重複使用在相同模式中。例如\(ab\).*\1,指的是匹配於ab組合的兩次重現,中間可存在任何資料的字元。\(ab\)\(cd\)[def]*\2\1匹配abcdcdab, abcdeeecdab, abcddddeeefffcdab,...

反向引用在尋找重複字元及匹配引號時特別好用,\(["']\).*\1匹配以單引號或雙引號括起來的字,如『foo'或「bar」。

\n: 重複在\(與\)括號內第n個子模式至此處的模式。n為1至9的數字,1為由左開始。

僅ere支援的meta字元:

: 同上面bre的\,只是括號內沒有反斜槓。

+:匹配前面正規表示式的乙個或多個例項。

?:匹配前面正規表示式的零個或乙個例項。

|:匹配於|符號前或後的正規表示式。  交替,優先順序最低。

():匹配於方括號括起來的正規表示式群。分組

^abcd|efgh$匹配字串的起始處是否有abcd或者字串結尾處是否有efgh

^(abcd|efgh)$找乙個正是abcd或正是efgh的字串

為配合非英語的環境,posix標準強化其字符集範圍的能力。

方括號表示式除了字面上的字元外,還支援字符集(character class),排序符號(collating symbol),等價字符集(equivalence class)。

排序(collating)是指給予成組的專案排列順序的操作。乙個posix的排序元素由當前locale中的元素名稱組成,並由[.與.]括起來。

等價字符集則用來讓不同字元在匹配時視為相同字元。等價字符集將類別(class)名稱以[=與=]括起來。

posix字符集以[:與:]將關鍵字組合起來,表示字元的類別。

[:alunm:]   數字字元

[:alpha:]  字母字元

[:blank:]  空格(space)與定位(tab)字元

[:cntrl:]  控制字元

[:digit:]  數字字元

[:graph:] 非空格(nonspace)字元

[:lower:] 小寫字母字元

[:print:]   可顯示字元

[:punct:] 標點符號字元

[:space:] 空白字元(whitespace)

[:upper:] 大寫字母字元

[:xdigit:]  十六進製制數字

注:排序元素、等價字符集以及字符集,都僅在方括號表示式的方括號內認可。也就是說,像[:alpha:]這樣的正規表示式,匹配字元a、l、p、h以及:,表示所有英文本母的正確寫法應為[[:alpha:]]。

在方括號表示式中,所有其他的meta字元都失去其特殊含義。所以[*\.]匹配字面上的星號、反斜槓以及句號。

要讓]進入該集合,可以將它放在列表的最前面*\.]。

要讓-進入該集合,可以將它放在列表的最前面[-*\.]。

要讓]和-進入該集合,]放到第一位,-放到最後一位,可以將它放在列表的最前面*\.-]。

posix明確指出:nul字元不需要是可匹配的。此外個別工具程式不允許使用.或來進行換行字元匹配。

通用擴充套件

注:單詞是由字母、數字及下劃線組成。

regex101

regextester

可參考:如何除錯正規表示式 -阿里雲

參考:《shell指令碼學習指南》

5分鐘搞懂正規表示式

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...