當我使用正規表示式的時候發現了很詭異的現象,如下:
[--ˇ]
[_-ˇ]
[=-ˇ]
就是第一個不能匹配字母,第二個能匹配字母,第三個能匹配字母和斜杠
我只是希望在字符串裡出現這幾個特殊字符就替換,沒想到連字母都替換了,我知道能用其他寫法實現此需求,但我就是不知道這樣寫為什麼會這麼詭異,大神們解釋下這個正則。
臥槽還有這幾個,寫個正則這麼費勁兒
[+-~]
[i-~]
[--~]
[_-~]
[=-~]
...
有興趣就跟hello world配對測試一下。
hello world
闭关修行中......
首先,第一個例子應該不是個合法正規則,所以不會有結果。
而後面的兩個例子中的正則是最基礎的 [a-z] 語法,表示匹配從一個字符到另一個字符編碼之間的所有字符。
[a-z]
兩個例子中,起始字元分別是 _、=, 终止字符都是全角符号 ˇ。 全角符號編碼大於所有 ASCII 編碼,所有在匹配 AscII 編碼時都匹配,不用多考慮,我們查下起始字元的 ASCII 編碼。
_
=
ˇ
ASCII 編碼中:/ < 0-9 < = < A-Z < < _ < a-z
/
0-9
A-Z
a-z
所以, [=-ˇ] 能匹配大写字母、反斜杠、小写字母,[_-ˇ]只能匹配小寫字母,兩者都不能匹配正斜杠和數字。
其次,這麼奇怪的正則還是不要寫為好,很難維護。
首先,第一個例子應該不是個合法正規則,所以不會有結果。
而後面的兩個例子中的正則是最基礎的
[a-z]
語法,表示匹配從一個字符到另一個字符編碼之間的所有字符。兩個例子中,起始字元分別是
_
、=
, 终止字符都是全角符号ˇ
。全角符號編碼大於所有 ASCII 編碼,所有在匹配 AscII 編碼時都匹配,不用多考慮,我們查下起始字元的 ASCII 編碼。
ASCII 編碼中:
/
<0-9
<=
<A-Z
<<
_
<a-z
所以,
[=-ˇ]
能匹配大写字母、反斜杠、小写字母,[_-ˇ]
只能匹配小寫字母,兩者都不能匹配正斜杠和數字。其次,這麼奇怪的正則還是不要寫為好,很難維護。