0%

【Regular Expression】正向環視、反向環視

說正向環視、反向環視感覺有點文謅謅的而且很難懂,其實白話文就是,比對這個位置的左(反向環視)右邊(正向環視)是否符合你下的條件,舉個例子

**
**
**註: **以下案例可以透過 https://regex101.com/ 做即時操作與測試

我想將下面中文的空格濾掉

哈 摟 你 好 嗎 ? Hello how are you?

變成這樣

哈摟你好嗎? Hello how are you?

如果要透過正規表示法比對出空格其實很簡單,只要下 **\s **即可,但如果這樣的話會變成這樣的結果。

哈摟你好嗎?Hellohowareyou?

因為所有的空格都被濾掉了,但其實英文跟英文單字之間的空格不能濾掉,這樣就變成無法理解的句子了,所以把我們的規則用中文表達就變成【我想濾掉空格,但該空格的左邊與右邊不能是英文字母

這時候正向環視與反性環視就派上用場了

名稱正規表示法解釋
正向環視(?=)這位置右邊要出現什麼
反向環視(?<=)這位置左邊要出現什麼
正向環視否定(?!)這位置右邊不能出現什麼
反向環視否定(?<!)這位置左邊不能出現什麼
所以剛剛的表達方法應該改成 **(?<![a-zA-Z])\s****(?![a-zA-Z])** ,其中**(?<![a-zA-Z])**表示空格的左邊不能出現英文字母,**(?![a-zA-Z])** 表示空格右邊的不能出現英文字母,只有這樣的空格才符合我們要求的,把他過濾掉,結果就會變成我們要的結果了 最後還有一個讀到的案例覺得也很實用,常常我們會需要在金錢上加上【,】來方便理解位數,例如

123,123,123

所以當我們拿到123456時,該怎麼把逗號加上去? 用中文表達就是,【我希望這個位置的右邊如果有三個數字,就幫我加上逗號】,所以寫出了**(?=\d{3})**,結果就變成了這樣

,1,2,3,456

看起來怪怪的,但其實符合我們下的判斷式,因為1、2、3右邊都可以數到三個數字,所以補上逗號合理,更精確我們的描述成【我希望這個位置的右邊有三個數字為一組,且比對到右邊不是數字為止,幫我加上逗號】,判斷式變成這樣**(?=(\d{3})+(?!\d)),其中三個數字一組的表達式(\d{3})+,且比對到右邊不是數字為止(?!\d)**,結果變成如下

,123,456

的確三個數字一組的補上逗號,但是最一開頭那邊不應該有逗號,所以應該加上一串描述【且左邊要是數字時,才補上逗號】,所以最後結果就變成**(?=(\d{3})+(?!\d))(?<=\d)**,而且切出來也就會剛剛好的

123,456