正則表示式——捕獲組和反向引用
正則表示式的捕獲組和反向引用: 使用小括號指定一個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其他程式中作進一步處理。預設情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標誌,第一個出現的分組的組號為1,第二個為2,以此類推。 在匹配的過程中,對於小括號括起來的子表示式,引擎會在正則表示式匹配成功時記錄下當前所有這些捕獲組對應的匹配結果(這些結果是確定的)。 我們在處理文字比如字串替換時,往往會用到反向引用,比如以一個實際中的例子來看: 比如有這樣的資料,一列日期,一列數量,列之間使用 \t 分割符分割:
需要把 3 列資料批量插入資料庫,顯然需要拼 SQL 語句來達到目的,這裡可以使用 excel 來進行單元格的連線操作,當然也可以使用更簡單的正則表示式來實現: 如圖,我們進行下面的替換操作:
之後,我們只需要拼上 INSERT INTO 語句,然後別忘了把最後一行的 逗號 改為 分號,完整的批量插入的 SQL 語句就拼好了。 下面具體解釋下例子中反向引用的使用方法:
^(\d{4}-\d{2}-\d{2})\t(\d*)\t(\d*)$
對於這個查詢的正則表示式,看到匹配了行首和行尾,說明是要替換一整行的。對於 \d{4}-\d{2}-\d{2} 顯然匹配日期部分,這裡這個日期是我們需要拿到也就是需要保留的部分,然後繼續向後匹配,因為列之間是 \t 分隔的,那麼拼上 \t ,而後是一個數值,我們可以用 \d* 來匹配,然後又是一個 \t ,最後的數值仍然 \d* 來匹配。注意這兩個數值也是需要保留下來的,用捕獲組捕獲。最後加上結束符,完整的一行就匹配出來了。 這裡,由於使用了捕獲組,在每一行的匹配過程中,記憶體中會儲存 \1 \2 \3 三個值對應日期和後兩個數字部分。 然後我們替換的目標字串就是
\('\1',\2,\3\),
這裡注意對小括號進行轉義,表示小括號的原意。由於 SQL 中日期需要加上單引號,這裡在 \1 兩側加上單引號,而後,SQL 語句中欄位間是逗號分隔,加上 ,\2,\3 即可。最後加上結束的小括號,以及 SQL 記錄每條後的逗號。(最後一行是分號,手動改即可)這樣,點選替換即可完成轉換。
對於捕獲組的標號,以左括號出現的次序來記錄,1,2,3 以此類推。
另外,對於有時多選分支用到了小括號,如果不需要捕獲,那麼就在括號里加上 ?: 即可,像這樣:
(?:不捕獲的內容)
這樣,子串的內容在匹配時不會被記錄,不會浪費額外的記憶體和計算資源,當然也不會記錄在捕獲組的引用次序裡。