說正向環視、反向環視感覺有點文謅謅的而且很難懂,其實白話文就是,比對這個位置的左(反向環視)右邊(正向環視)是否符合你下的條件,舉個例子
**
****註: **以下案例可以透過 https://regex101.com/ 做即時操作與測試
我想將下面中文的空格濾掉
哈 摟 你 好 嗎 ? Hello how are you?
變成這樣
哈摟你好嗎? Hello how are you?
如果要透過正規表示法比對出空格其實很簡單,只要下 **\s **即可,但如果這樣的話會變成這樣的結果。
哈摟你好嗎?Hellohowareyou?
因為所有的空格都被濾掉了,但其實英文跟英文單字之間的空格不能濾掉,這樣就變成無法理解的句子了,所以把我們的規則用中文表達就變成【我想濾掉空格,但該空格的左邊與右邊不能是英文字母】
這時候正向環視與反性環視就派上用場了
名稱 | 正規表示法 | 解釋 |
正向環視 | (?=) | 這位置右邊要出現什麼 |
反向環視 | (?<=) | 這位置左邊要出現什麼 |
正向環視否定 | (?!) | 這位置右邊不能出現什麼 |
反向環視否定 | (?<!) | 這位置左邊不能出現什麼 |
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