2016-05-15 81 views
1

我想選擇<h3>/h3> <之間的所有文本。選擇後,我喜歡用結果替換我的字符串的值。在以下例子中的結果應該是基本信息正則表達式使用結果替換字符串

String test="<h3>Basic Information</h3> <div>"; 
test = test.replaceAll("<h3>(.*?)</h3>", "$1"); 

但此刻結果是

基本信息& LT; DIV & GT;

+1

我不明白你爲什麼會想到得到的只有*「基本信息」 *與此代碼的結果。你確定'replaceAll'確實是你想要的嗎?也許你需要提取比賽而不是替換它。 –

回答

4

用正則表達式,你可以這樣做:

String test="<h3>Basic Information</h3> <div>"; 
String repl = test.replaceFirst(".*<h3>([^&]+).*/h3> <.*", "$1"); 
//=> Basic Information 

雖然你可以完全避免的正則表達式,並使用String API來提取相同的文字以及。

或者您可以使用此正則表達式匹配:

<h3>([^&]+).*/h3> < 

,搶捕獲組#1使用PatternMatches的API。

+0

是的,一個例子就是僅僅爲了性能而使用字符串分割。除非用於更大的東西。這些實際上是xml片段,所以如果它們變得足夠大,也許SAX解析器可以更好地完成這項工作。 –

1

試試這個:

Pattern pattern = Pattern.compile("<h3>(.*)<\\/h3>"); 
Matcher matcher = pattern.matcher("<h3>Basic Information</h3> <div>"); 
matcher.find(); 
StringBuffer sb = new StringBuffer(); 
matcher.appendReplacement(sb,"$1"); 
String result = sb.toString(); 

你之所以不能這樣做,只有replaceFirst那是因爲appendTail方法被調用在replaceFirst方法結束。匹配器將用替換未指定的組,指定的組以及當然不匹配的位也是如此,因爲沒有爲它們創建匹配,所以它們不會被替換爲所有。

在您的查詢的情況下:

組0:<H3>

組1:基本信息

組0:</H3 >

不匹配:<div>

這只是您可以對匹配器執行的一個通用示例。當然,如果你只是想在組中特定的......好吧只需使用:

matcher.group(1) 
+0

爲什麼使用'StringBuffer'而不是僅僅調用'group(1)'?'sb.toString;'不是有效的java。 – RealSkeptic

+0

這只是一個例子。當然,你可以使用組。我的意思是如果你只想替換沒有無與倫比的Strings的組,那麼StringBuffer仍然更好。如果你只想要一個特定的團體......那麼只需要得到團隊。我剛剛編輯它。 –

+0

@RealSkeptic btw,小心解釋'sb.toString()是不是Java? AFAIK,''StringBuffer'內容通過'toString()'方法轉換爲字符串。 –