2011-06-18 62 views
0

我試圖使用Java的下面的正則表達式報價,這是應該匹配任何lang="2-char-lang-name"Java中,逃逸(b)使用正則表達式

String lang = "lang=\"" + L.detectLang(inputText) +"\""; 
shovel.replaceFirst("lang=\"[..]\"", lang); 

我知道,一個單斜槓將通過正則表達式來解釋作爲一個斜槓而不是一個轉義字符(所以我的代碼不起作用),但如果我轉義斜線,"將不會再逃脫,我會得到一個語法錯誤。

換句話說,如何在正則表達式中包含""lang=\\"[..]\\""將不起作用。我也嘗試了三次斜線,也沒有任何匹配。

我也知道你不使用正則表達式來解析XML/HTML的一般規則。 (並且shovel是XML)但是,我所做的只是查找位於XML前30個字符內的lang屬性,並且我想替換它。在這種情況下使用正則表達式真的是個不錯的主意嗎?我不認爲使用DOM會更好/更高效。

回答

4

三斜線將是正確的(\\ + \"變得\ + " = \")。 (更新:事實上,事實證明,甚至沒有必要。似乎單斜線也有效。)問題是您使用[..]; []符號表示「這裏的任何字符」(因此[..]只是表示「任何字符」)。

[],你應該得到你想要的東西:

String ab = "foo=\"bar\" lang=\"AB\""; 
String regex = "lang=\\\"..\\\""; 
String cd = ab.replaceFirst(regex, "lang=\"CD\""); 
System.out.println(cd); 

輸出:

foo="bar" lang="CD" 
+0

啊是的,我並沒有真正用'[..]'來解析他在那裏做什麼。我認爲在'[]'內部'''是按字面解釋的,所以'[..]'意味着「任何一個單獨的字符都是'.'或'''」。 – OpenSauce

+0

當然......你說得對,'猜我的正則表達式太生鏽了。謝謝。 – Spectraljump

2

你用一個反斜槓試過了嗎?的

public static void main(String[] args) { 
    String inputString = "<xml lang=\"the Queen's English\">"; 
    System.out.println(inputString.replaceFirst("lang=\"[^\"]*\"", "lang=\"American\"")); 
} 

輸出是

<xml lang="American"> 

,如果我正確地讀你,是你想要的。

編輯添加:單個反斜槓工作的原因是它實際上不是字符串的一部分,它只是表達字符串的語法的一部分。字符串"\""的長度是1,而不是2,方法replaceFirst只看到包含"(沒有反斜槓)的字符串。這就是爲什麼例如\s(正則表達式中的空白字符類)必須寫入\\s在Java字符串文字中。

關於使用正則表達式的智慧:如果你確定你正在處理的文件的格式,這應該沒問題。如果這些文件可能包含註釋掉的標題,並且在真正的標題上方有lang規範,那麼您可能會遇到麻煩!

+0

標準和諸如此類的東西不,它是良好的XML。謝謝你指出一個斜線會起作用。我認爲它不會,因爲它也是一個正則表達式的特殊字符。 – Spectraljump