Java中的 \ (反斜線)和正則表達式

今天在問答區上看到一則有意思的問題,直接把截圖搬過來,以下: (http://www.oschina.net/question/2268249_218189#tags_nav)
html

看起來明顯輸入的正則表達式不一樣,可是輸出結果都同樣(製表符被替換)。隨後去查了下Pattern的Doc,發現下面一段話:java

It is an error to use a backslash prior to any alphabetic character that does not denote an escaped construct; these are reserved for future extensions to the regular-expression language. A backslash may be used prior to a non-alphabetic character regardless of whether that character is part of an unescaped construct.正則表達式

其大意是,一個反斜線能夠放在任何一個非字母以前而不管這個字符是不是一個能夠escaped的字符。(通過測試發現,若是反斜線後面跟着一個非字母字符的時候是不起任何做用的,跟不加反斜線的效果同樣)express

那麼回頭來看這個問題,因爲\在Java中是轉義符,因此出現有\的地方咱們先作一個轉換以下,左邊是原始輸入,右邊是轉義之後的字符串數組(數組的形式更方便區分):api

  • \t -> {\t}
  • \ \t -> {\,t}
  • \ \ \t -> {\, \t}
  • \ \ \ \t -> {\,\,t} (增長了這個選項以便看到輸出和其餘三個的區別)

第一個就是製表符,會被替換掉。 第二個轉義之後雖然不是製表符,可是從字面上看來也是製表符,因此正則替換的時候也被替換掉了。 第三個轉義之後是一個\和一個製表符,根據前面看到的JavaDoc提到的內容。製表符是一個非字母字符,因此這個用法其實就是表示一個製表符(你也能夠把 \t 換成 \你 看看輸出結果)。 第四個轉義之後是,\和t三個字符,是不知足替換條件的。數組

相關文章
相關標籤/搜索