2016-10-30 91 views
1
public class MainTest { 
    public static void main(String ... args) { 
     Pattern p = Pattern.compile(args[0]); 
     Matcher m = p.matcher(args[1]); 
     while (m.find()) 
      System.out.print(m.start()+" "); 
     System.out.println(); 
    } 
} 

上面的代碼時,用下面的命令正則表達式在Java

java MainTest "\b" "^23 *$76 bc" 
java MainTest "\B" "^23 *$76 bc" 
java MainTest "\S" "^23 *$76 bc" 
java MainTest "\W" "^23 *$76 bc" 

運行不同的字符類產生

1 3 5 6 7 9 
0 2 4 8 
0 1 2 4 5 7 8 
0 3 4 6 

雖然我幾乎確信這將是

1 3 6 8 9 11 
0 2 4 5 7 10 
0 1 2 4 5 6 7 9 10 
0 3 4 5 8 

好的,所以\w的意思是s [0-9A-Za-z_]\b應匹配任何\w\W邊界,並且\W應該匹配空格和不在alnum+下劃線的內容。那麼,爲什麼我會得到這些結果呢?我來到這裏是爲了擺脫我對Java中正則表達式的一些嚴重誤解。

+0

@Aaron執行:這是我在說什麼。 $,b,c也都是非空格的。你有沒有嘗試在你的機器上運行我的代碼? – Ilonpilaaja

+1

哦,是的,nvm,我看錯了結果-_- – Aaron

+1

看起來像你的預期輸出給我時,不使用命令行參數:http://ideone.com/IbCykI – Marvin

回答

1

@Andreas是正確的。問題出現在Linux shell中:$ 7被替換爲空,命令行參數變爲「^ 23 * 6 bc」。

+1

如果你用'''而不是'''引用它,它應該可以工作。見http://www.grymoire.com/Unix/Quote.html#uh-1 – Andreas

+0

@Andreas:隨時回答。我會接受你的回答。 – Ilonpilaaja

+1

StackOverflow的目的是爲常見(或不常見)問題彙編一個彙編。但是,您的問題是關於正則表達式無法正常工作,解決方案是使用正確的引號來防止Linux shell替換。任何人都不可能爲類似的shell替換問題找到這個問題/答案,所以回答通常不會有用。我建議刪除這個問題。 – Andreas

0

我在Linux和Windows上執行相同的程序。 我發現,Linux shell替換符號後引用的參數$ 與他們的價值觀(在你的情況,空,如安德烈亞斯解釋)。 下面是示例代碼都將OS

System.out.println("0:"+args[0]); 
    System.out.println("1:"+args[1]); 
    Pattern p = Pattern.compile(args[0]); 
    Matcher m = p.matcher(args[1]); 
    while (m.find()) 
     System.out.print(m.start()+" "); 
    System.out.println(); 

上工作,並使用單引號參數

java MainTest '\b' '^23 *$76 bc' 
java MainTest '\B' '^23 *$76 bc' 
java MainTest '\S' '^23 *$76 bc' 
java MainTest '\W' '^23 *$76 bc' 
+0

只是一個挑剔的問題:'bash'沒有'null'值;對未綁定變量'$ 7'的引用將在被引用時被解析爲空字符串(除非已設置shell的「數據集名」標誌,在這種情況下會引發錯誤)。 – Aaron