正斜杠,又稱左斜杠疟游,符號是"/"呼畸;反斜杠,也稱右斜杠颁虐,符號是"\"蛮原。
用在目錄中
在Unix/Linux中,路徑的分隔采用正斜杠"/"另绩,比如"/home/hutaow"儒陨;而在Windows中花嘶,路徑分隔采用反斜 杠"\",比如"C:\Windows\System"蹦漠。
有時我們會看到這樣的路徑寫法椭员,"C:\\Windows\\System",也就是用兩個反斜杠來分隔路徑笛园,這種寫法在網(wǎng)絡應用或編程中經(jīng) 嘲鳎看到,事實上研铆,上面這個路徑可以用"C:/Windows/System"來代替埋同,不會出錯。但是如果寫成了"C:\Windows\System"棵红, 那就可能會出現(xiàn)各種奇怪的錯誤了凶赁。
至于上述問題出現(xiàn)的原因,要從字符串解析這方面來分析逆甜。
學過編程的人都應該知道虱肄,在C里面,輸出字符串時忆绰,如果想輸出一個換行浩峡,那就要加上'\n'這個標志,類似的错敢,輸出一個TAB翰灾,就加上' \t',也就是說稚茅,反斜杠("\")這個符號會把跟在它后面的字符結合起來轉義成其它字符纸淮。根據(jù)這個原理,如果想輸出雙引號('"')亚享,就需要輸入' \"'咽块,這樣才會將包含了雙引號的字符串正確的寫入內存中。那么如果想輸入一個反斜杠呢欺税?很簡單侈沪,只要敲'\\'就可以了。
看到這里或許有些人已經(jīng)看出眉目了晚凿,如果"C:\Windows\System"這個路徑字符串交給C編譯器編譯亭罪,實際寫入內存的字符串并沒 有包含反斜杠"\"霞玄,甚至緊跟在反斜杠后面的字母也一起被轉義成了其它的字符饥漫,再次調用的話勢必會出問題。
字符串解析不僅僅局限于C編譯器唆阿,Java編譯器、一些配置文件的解析箩祥、Web服務器等等院崇,都會遇到對字符串進行解析的這個問題,由于傳統(tǒng)的 Windows采用的是單個斜杠的路徑分隔形式袍祖,導致在對文件路徑進行解析的時候可能發(fā)生不必要的錯誤底瓣,所以就出現(xiàn)了用雙反斜杠"\\"分隔路徑的形式。 不管解析引擎是否將反斜杠解析成轉義字符盲泛,最終在內存中得到的都是"\"濒持,結果也就不會出問題了键耕。
由此也可以看出Windows或者說DOS在設計初期考慮不夠周全寺滚,為了和Unix一些特征區(qū)別開來,將Unix中的正斜杠"/"分隔路徑方 式改變成了反斜杠"\"屈雄。這樣改變導致的一個問題就是在早期DOS命令行中村视,正常的文件名是不能包含空格的,如果包含了空格酒奶,會導致輸入這樣的文件名時蚁孔, 命令解析無法將其和參數(shù)區(qū)分開。例如惋嚎,想要進入"hutaow yuan"這個目錄(在此先忽略8.3命名規(guī)則)杠氢,直接輸入"cd hutaow yuan",命令行會將其解析為進入"hutaow"目錄另伍,而后面的"yuan"做參數(shù)鼻百,這顯然不是所期望的。
而在Unix中摆尝,文件名如果包含空格温艇,可以直接在空格前加上反斜杠"\"進行轉義,從而很好的和命令參數(shù)區(qū)別出來(參數(shù)之間一般使用空格分 隔)堕汞。還是上面的例子勺爱,在Unix中,只要輸入"cd hutaow\ yuan"(在yuan前面的空格前加上"\")讯检,命令行會正確的辨認出"hutaow yuan"并進入這個目錄琐鲁。
當然,現(xiàn)在Windows的后續(xù)版本已經(jīng)使用其它方法(比如文件名用雙引號括兹俗啤)解決了空格問題围段。
轉義字符
如“\n”(表示換行)、“\””(表示字符‘”’)等,所以在字符串中要表示字符“\”要用“\”來表示
代碼如下:
//因為\s不是轉義字符挡毅,如果你這樣定義一個字符串,編譯器會報錯
Strings ="abcd\s123";
//要這樣定義獲取
String s = "abcd\123"Strings ="abcd\\s123";
特殊:在正則表達式中
在正則表達式中的“\”表示和后面緊跟著的那個字符構成一個轉義字符蒜撮,代表著特殊的意義;所以如果你要在正則表達式中表示一個反斜杠\,應當寫成“\\”段磨。因為在正則要經(jīng)過兩次轉義取逾,因此就需要四個反斜杠才可以匹配一個反斜杠。Java先轉義成“\”苹支,在由正則進行一次轉義砾隅,就結果就為“\”。
一句話:表示正則表達式里面的斜杠“\”债蜜,然后再用字符串表示出來晴埂。而這2個斜杠分別需要一個轉義符,這樣就成了4個斜杠在正則表達式里面表示一個斜杠寻定。
下面代碼示例:
//將會報錯,你應當這樣寫Matcher m =
Matcher m = Pattern.compile(“\\”).matcher(“\\”);
//這才是正確且匹配的
Pattern.compile(“\\\\”).matcher(“\\”);
String類中兩個方法的使用:
1儒洛、replace(CharSequence target,CharSequence?replacement)
1、replaceAll(String regex, String replacement)
public static void main(String[] arg) {
String s ="abcd\\123\\\\dcba";
System.out.println(s); ? //結果是abcd\123\\dcba
System.out.println(s.replaceAll("\\\\", "\\\\\\\\")); ? //結果是abcd\\123\\\\dcba狼速,記住\\\\表示\
System.out.println(s.replace("\\", "\\\\\\\\")); ?? //結果是abcd\\\\123\\\\\\\\dcba
}