2016-05-15 10 views
1

<h3>/h3> <の間のすべてのテキストを選択します。選択後、私は結果に私のStringの値を置き換えるのが好きです。次の例では、結果は、基本情報正規表現の結果を置換文字列

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を使用することができますが。

別の方法としては、マッチングのために、この正規表現を使用することができます。PatternMatches APIを使用してグループ1位を獲得し

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

とグラブを。

+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(); 

あなたがそれを行うことができない理由はただappendTail方法はreplaceFirst方法の終了時に呼び出されるので、それはですreplaceFirstという。マッチャーは、指定しなかったグループをの空の番号に置き換えます。指定したグループはの値です。マッチしなかったビットは当然マッチしなかったので置き換えられませんすべて。

グループ0:クエリの場合

<H3>

グループ1:基本情報

グループ0:</H3 >

不一致:<div>

これは、マッチャーでできることの一般的な例です。もちろん、あなただけの特定のグループをしたい場合は...まあは、ちょうど使用:あなたが唯一*「基本情報」を得ることを期待したい理由

matcher.group(1) 
+0

'group(1)'を呼び出す代わりに 'StringBuffer'を使うのはなぜですか?そして 'sb.toString;'は有効なjavaではありません。 – RealSkeptic

+0

これは単なる例です。もちろん、あなたはそれのためのグループを使用することができます。私はあなたがStringBufferについてまだ不満足なStringsを持たずにグループを置き換えたいのであれば、まだまだ良いことです。あなたがただ一つの特定のグループを望むなら...まあまあグループを得る。私はちょうどそれを編集しました。 –

+0

@RealSkeptic btwは、 'sb.toString()'がJavaでないことをあなたが意味することを説明するために気を付けますか? AFAIK、 'StringBuffer'の内容は' toString() 'メソッドによって文字列に変換されます。 –

関連する問題