【Regex】用正規表達式取代時保留部分內容不被替換

AhChao
雜食性的貓
Published in
Mar 30, 2021

Regex 是工程師搜尋時的利器之一,能夠做到在有格式的文件結構裡做到格式化的搜尋,本文暫且不提關於正規表達式的基本,是想來談談最近遇到的需求:

如何搜尋正規表達式內容後,取代時保留部分內容不被替換?

讓我們來看看這個例子。

嗨!小明生日快樂!
欸!小王生日快樂!
哇!小美生日快樂!

如果今天我們要改成

嗨小明生日快樂~
欸小王生日快樂~
哇小美生日快樂~

很明顯,我們不能直接把「!」替換成「?」,這樣的話生日快樂後面也會變成「?」,也就是:「嗨?小明生日快樂?」,就不是我們想要的結果了。

我們可以用 Regex 來做到搜尋這個Pattern。

\S*!\S*生日快樂!
圖中使用Sublime做示範,目前大多數的文字編輯軟體都有對應用 Regex 搜尋的方式,以 Sublime 為例就是按下星星

搜尋是搜尋到了,那要怎麼替換呢?

我們想做的事其實是把S*抽出來,不要被替換掉,但是如果我們用這樣

\S*\S*生日快樂~

當作替換標的:

看起來並沒有照想像中的運作...

那是因為 Syntax 的問題,這裡我們要使用類似變數的方式來做替換。Syntax 如下:

(括號起目標)(第N個括號起目標)
$(第幾個括號的目標)$(第幾個括號的目標)

用我們的例子來舉例的話搜尋目標跟替換標的應該會是

(\S*)!(\S*)生日快樂!
$1$2生日快樂~
運作完美!

沒錯,就如同圖片中的,使用這個語法,就能把你的 Regex 標的像變數一樣使用,而且不會被取代囉!

甚至能做到這樣的順序替換!

如果這篇有幫到為同樣問題苦惱的你,別忘了給我拍手鼓勵一下囉 :)

--

--

雜食性的貓
雜食性的貓

Published in 雜食性的貓

具有貓特質的雜食工程師,桌遊是精神糧食之一。喜歡我的文章或介紹的話可以幫那篇文章拍個手鼓勵一下^^

AhChao
AhChao

Written by AhChao

我的三個關鍵字 : 程式、遊戲、學習 | 3 Key Words About Me : Programing , Gaming, Learning