將錯就錯?正規表示式 [,-.]

banq發表於2022-07-04

正規表示式 [,-.]其目的很清楚:匹配兩組由逗號、破折號或句號分隔的兩個數字。
當然,它不應該起作用。
字元類中的破折號很特別,因為它們用於範圍(如[a-z]用於匹配小寫ASCII字母)。
如果你想在一個字元類中使用"-",你應該把它放在開頭或結尾,而不是放在中間。所以這應該是[-,.]而不是[,-.]。

我以為[,-.]是個錯字,它不會與-相匹配,但我找不到一個錯誤。事實上,它工作得很好,你可以自己試試。

$ perl -E 'say "ok" if "12-34" =~ /\d{2}[,-.]\d{2}/'
ok


發生了什麼事?
逗號、破折號和句號在ASCII中是緊挨著的。
因此,抓取從,到.的所有字元也包括-,而不包括其他。[,-.]是唯一可能的字元類,中間有一個-,只匹配-。
只適合匹配字元類的開頭或結尾的。

另外一種解釋:因為破折號將其變成範圍運算子(如 0-9),而破折號位於 ASCII 表中的逗號和點之間。
這是一場巧合避免的災難。那好美麗。

相關文章