今天工作的時候,遇到了個奇怪的問題,是關於字符串轉義與替換的。最后終於解決了,特總結
下。
小demo,
package com.westward; public class Demo { /** * 1.將字符串 "a b"替換為"a 1b".ab之間不是空格,是制表符。 * 2.將字符串 "a\tb"替換為"a 2b". * */ public static void main(String[] args) { // TODO Auto-generated method stub String string1= "a\tb"; System.out.println("string1 ="+ string1); String string2= "a\\tb"; System.out.println("string2 ="+ string2); System.out.println("---------轉換開始-----------"); string1= string1.replaceAll("\\t", " 1"); string2= string2.replaceAll("\\\\t", " 2"); System.out.println("format:string1 ="+ string1); System.out.println("format:string2 ="+ string2); } }
output:
string1 =a b
string2 =a\tb
---------轉換開始-----------
format:string1 =a 1b
format:string2 =a 2b
總結:
java語言,字符串中的反斜杠\是轉義字符的意思,而不是反斜杠本身。所以我們如果想打印出反斜杠本身,必須\\。前面一個是轉義字符,將后面的轉義字符轉義為反斜杠本身,有點繞。
特別需要注意的是,我們在控制台打印出比如字符串:xyz\txxx,那么我們必須敏感的認識到,代碼中的字符串肯定不是打印出來的原樣,而應該是 xyz\\txxx。同樣的,如果控制台打印出的字符串是:xyz xxx,(中間是制表符),那么代碼中的字符串應該是:xyz\txxx或者xyz xxx。
注意看上面的demo,當我們需要將字符串中的某部分替換成另一部分時,用到了String的replaceAll()這個方法,這個方法的第一個參數是正則表達式。這里我們需要注意:
java中,\是轉義字符,在正則表達式(正則表達式本身也相當於一門語言,不僅僅java有,其他語言也有)中,\也是轉義字符。正則表達式中\t表示制表符,那么在java中表示此正則表達式制表符,就必須這樣來表示:\\t. 如果我們需要表示正則中的\t本身(而不是制表符)呢?我們需要這樣來表示:\\\\t.其實,它翻譯成正則,就是\\t,第一個反斜杠轉義第二個,第三個反斜杠轉義第四個,正則中,\\t第一個反斜杠將第二個反斜杠轉義為反斜杠本身,原理和java語言一樣。