表示式反向解析 正規表示式 反向引用

2021-10-16 06:15:44 字數 2480 閱讀 3494

分組不僅用在匹配結果中,也可以在匹配的正規表示式中使用分組匹配的結果,這種功能稱為反向引用(backreference)。當待匹配的字串中有些子字串出現多次的話,正規表示式模式可以將第乙個出現的子字串儲存在分組中,在模式的後面可以直接引用第乙個匹配的結果。因為分組即可通過索引也可以通過名字來訪問,所以反向引用裡也有索引版和名字的版本:

根據索引反向引用的語法為:「umber」,number是分組在正規表示式中的位置,從1開始計數。如**清單 3 - 8中第9行的模式「(w+)s(1)」,1即表示反向引用第乙個分組「(w+)」的匹配結果,由於在後面的第13行需要將「1」當作乙個新的分組使用 – match.groups[2],所以使用括號將模式建立了乙個新分組,否則的話括號是可以省略的。

在正規表示式裡,「1」到」9」永遠被解析成索引反向引用語法,如果使用的分組索引不存在,會導致正規表示式引擎丟擲argumentexception異常,如「(w+)s2」就會導致異常,因為「2」前面只有乙個分組「(w+)」。「10」及以上只有在分組數足夠的話才會被當作索引反向引用,否則會被當作普通的八進位制數字進行匹配,不過也不建議讀者在寫太複雜的正規表示式,造成除錯和**閱讀上的困難。

在visual studio code等編輯器裡同樣是支援反向引用的,圖 3 - 7中使用模式「(d+)(-)12「成功匹配「2009-09-09」這個字串,而不能匹配「2018-12-31」,這是因為」1」對應的是第乙個分組:「(d+)」,」2」對應的是第二個分組「(-)」。

圖 3 - 7在vs code裡使用反向引用

如果給分組命名過的話,使用命名反向引用就方便得多,命名反向引用的語法可以是:「k」或「k'name'」,其中name就是分組的名字。**清單 3 - 8中第10行就演示這種使用方法,首先定義了乙個「」分組用來匹配乙個單詞,再使用「k」反向引用前面匹配的結果,從而找出重複的單詞。

替換

正規表示式除了可以用來在輸入字串中匹配和提取子字串以外,還可以用在字串替換中,在regex.replace方法中可以使用替換(substitution)模式來使用匹配結果進行替換操作,這個方法有乙個replacement引數,在replacement引數中可以使用替換模式。替換模式以字元「$」開頭,通常跟分組一起使用,與反向引用類似,支援按索引和按命名來使用分組匹配結果。如**清單 3 - 14中,使用正規表示式將不同貨幣金額中的貨幣符號去掉,只留下金額的方法。在第1行的模式中:

lp*:匹配貨幣符號字元,這個字元是可選的;

l(s?d+[.,]?d*):「s?」匹配零到乙個空格字元,「d+[.,]?d*」匹配金額,金額的整數部分和小數部分使用點號「.」或逗號「,」分隔,不同國家表示小數的方式是不一樣的,中國習慣上使用點號「.」分隔小數,而西歐一些國家如德國的習慣上使用逗號「,」分隔小數。當然這個模式有乙個額外的匹配效果 – 即可以匹配按千分位表示的數字,如第4行中最後乙個數字:「123,456.00」。

**清單 3 - 14正規表示式替換模式示例

1 var pattern = @"p*(s?d+[.,]?d*)";

2 var replacement = "$1";

3 var input = "$16.32 12.19 £16.29 €18.29 €18,29 ¥123.34 $123,456.00";

4 var result = regex.replace(input, pattern, replacement);

5 console.writeline(result);

6 7 pattern = @"p*(?s?d+[.,]?d*)";

8 replacement = "$";

9 result = regex.replace(input, pattern, replacement);

10 console.writeline(result);

如果模式成功匹配,第2行中的「$1」儲存的是第乙個分組匹配的結果,數字「1」是分組的索引,跟反向引用類似,正規表示式中的分組索引是從1開始的。第7行使用與第1行相同的模式,只不過命名匹配金額的分組為「amount」,因此在第8行的替換模式中可以直接使用名稱「amount」來使用匹配結果。

表 3 - 5 .net中的正規表示式替換模式說明

在visual studioide和visual studio code等文字編輯器中,也可以直接使用替換模式來提高編輯效率,如筆者經常將excel、網頁等地方拷貝的文字列表轉換成源**中的字串陣列,就會用到替換模式技巧。如圖 3 - 8中,在查詢文字框中使用「^(.+)$」模式來匹配每一行的完整字串,在替換文字框中,模式"$&

正規表示式反向引用

微軟關於正規表示式的反向引用的官方文件 1 第1個 代表任意字元,後面的 代表 前面的任意字元有0個或多個 第2個 也代表任意字元,但它被括號括起來了,括號代表它 獲了,相當於被複製了,還沒被貼上 第3個 也代表任意字元,後面的 代表 前面的任意字元有0個或多個 第1個 代表轉譯符,這個符號不能直接...

正規表示式的反向引用

其實,小括號包含的表示式所匹配到的字串 不僅是在匹配結束後才可以使用,在匹配過程中也可以使用。表示式後邊的部分,可以引用前面 括號內的子匹配已經匹配到的字串 引用方法是 加上乙個數字。1 引用第1對括號內匹配到的字串,2 引用第2對括號內匹配到的字串 以此類推,如果一對括號內包含另一對括號,則外層的...

正規表示式之反向引用

1.概述 捕獲組捕獲到的內容,不僅可以在正規表示式外部通過程式進行引用,也可以在正規表示式內部進行引用,這種引用方式就是反向引用。要了解反向引用,首先要了解捕獲組,關於捕獲組,參考 正則基礎之 捕獲組 capture group 反向引用的作用通常是用來查詢或限定重複 查詢或限定指定標識配對出現等等...