2013-06-04 36 views
3

當我使用'+','*','('和')'時,我不斷收到有關懸空元字符的錯誤。懸掛元字符

我已經嘗試在正則表達式中轉義這些字符,但我仍然得到錯誤。這是我有:

"[-\\+\\*/%\\(\\)]" 

更新:

測試:

String input = "+"; 

String vals = new WNScanner(input).getNextToken(); //********** 
System.out.println("token: " + vals); 
System.out.println(vals.matches("[-+*/%()]")); 

從另一個類:

... 

    String expression = input; 
    ... 

public String getNextToken() { 

    String[] token = {""}; 

    if (expression.length() == 0) 
     return ""; 

    token = expression.split("\\s"); 
    recentToken = token[0]; 
    expression = expression.replaceFirst(token[0], "");  //************* 
    expression = expression.trim(); 

    return token[0]; 


} 

*有這些線路上的例外。

+1

這些都不需要反斜槓內 「[]」 S逃逸(但是, 「 - 」 必須是 「[]」 的內線的第一個字符)。 –

+0

@ShadowCreeper哦。但如果我不包含反斜槓,我仍然會遇到錯誤。任何想法? – user2430361

+0

在問題中發佈您的嘗試(代碼)和錯誤消息(您可以將它簡化爲簡單的類或單個函數)。 –

回答

6

OK,我不知道你想達到什麼有...特別是在這一行:

expression = expression.replaceFirst(token[0], ""); 

如果你輸入的字符串"+",則你的整個正則表達式+。這是不合法的。

您需要引用輸入字符串,才能在任何正則表達式相關的操作使用它,這包括String.replaceFirst().replaceAll()(但不.replace() ...)。

因此,做到:

final String re = Pattern.quote(token[0]); 
expression = expression.replaceFirst(re, ""); 
+0

哇。謝謝。這解決了這個問題。但你能解釋一下Pattern是什麼嗎? – user2430361

+0

'Pattern'是JDK的正則表達式處理基礎類。通過調用靜態工廠方法'Pattern.compile()'來創建一個正則表達式對象。這個類的另一個靜態方法是這裏使用的'.quote()'方法,在給定'String'作爲輸入的情況下,它會引用其中的所有元字符,以便從該字符串創建的正則表達式自動生效。 [此處爲'Pattern'的完整javadoc](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)。注意:不要忘記接受答案;) – fge