Regex 是工程師搜尋時的利器之一,能夠做到在有格式的文件結構裡做到格式化的搜尋,本文暫且不提關於正規表達式的基本,是想來談談最近遇到的需求:
如何搜尋正規表達式內容後,取代時保留部分內容不被替換?
讓我們來看看這個例子。
嗨!小明生日快樂!
欸!小王生日快樂!
哇!小美生日快樂!
如果今天我們要改成
嗨小明生日快樂~
欸小王生日快樂~
哇小美生日快樂~
很明顯,我們不能直接把「!」替換成「?」,這樣的話生日快樂後面也會變成「?」,也就是:「嗨?小明生日快樂?」,就不是我們想要的結果了。
我們可以用 Regex 來做到搜尋這個Pattern。
\S*!\S*生日快樂!
搜尋是搜尋到了,那要怎麼替換呢?
我們想做的事其實是把S*抽出來,不要被替換掉,但是如果我們用這樣
\S*\S*生日快樂~
當作替換標的:
看起來並沒有照想像中的運作...
那是因為 Syntax 的問題,這裡我們要使用類似變數的方式來做替換。Syntax 如下:
(括號起目標)(第N個括號起目標)
$(第幾個括號的目標)$(第幾個括號的目標)
用我們的例子來舉例的話搜尋目標跟替換標的應該會是
(\S*)!(\S*)生日快樂!
$1$2生日快樂~
沒錯,就如同圖片中的,使用這個語法,就能把你的 Regex 標的像變數一樣使用,而且不會被取代囉!
如果這篇有幫到為同樣問題苦惱的你,別忘了給我拍手鼓勵一下囉 :)