2010-09-04 49 views
2

我正在學習使用Java的模式和匹配器,這是我書中的示例代碼片段。它按照作者的描述工作,但我沒有得到的是爲什麼\\.最終成爲一個點而不是反斜槓(\\部分)和一個點(。部分)。編譯器是否從左向右讀取?爲什麼在這個正則表達式中\沒有解釋爲黑色的?

import java.util.regex.*; 
public class SplitTest { 
    public static void main(String[] args) { 
     String input= "www.cs.cornell.edu";       

     Pattern p = Pattern.compile("\\."); 
     String pieces[] = p.split(input); 
     for (int i=0; i<pieces.length; i++){ 
      System.out.println(pieces[i]);  
      } 



    } 
} 

回答

6

它在解析字符串文字時被解釋一次,而在正則表達式編譯器中被解析一次。

"\\." - >"\." - 字符串字面
"\." - >文字. - 正則表達式編譯器

+0

哦。咄! * facepalm *謝謝! – 2010-09-04 00:22:52

+2

這就是Java需要像其他語言一樣使用Regex支持的原因,它不會使用引號,而是使用'/\./'。 – alternative 2010-09-04 00:25:17

+0

Java需要像.NET語言那樣的@string。它不會破壞註釋語法。 – 2010-09-04 00:28:10

4

您必須雙擊逃避字符串文字。 "\\\\." 由於Java將字符串文字"\\."解釋爲\.,這不是您所期望的。 試試這個:System.out.println("\\."),你看到的是你在正則表達式中得到的。

編輯:您的輸入字符串是"www.cs.cornell.edu"。你知道你在做什麼嗎?也許你正在嘗試按點擊分割(\.),它的Java文字是你輸入的"\\."

也許你試圖匹配一個反斜槓,然後一個點,這意味着它的正則表達式是\\\.,其中它的Java字面是"\\\\\\."

+1

對不起,我不清楚。我*是*試圖按點分割。或者說,作者是。代碼正確地執行。 – 2010-09-04 00:35:01

+0

人們想知道爲什麼我拒絕使用java的正則表達式... – TheLQ 2010-09-04 02:26:47

0

您的代碼可以簡化一點,像這樣:

 
public class SplitTest { 
    public static void main(String[] args) { 
     String input = "www.cs.cornell.edu"; 
     String[] pieces = input.split("\\."); 
     for (String piece : pieces) { 
      System.out.println(piece); 
     } 
    } 
} 
「雙反斜槓時間「在這種情況下正如預期的那樣工作,但是在stackoverflow上的格式化需要」四重反斜槓時間段「,這有點奇怪。

相關問題