2009-08-26 8 views
1

xmlドキュメントからすべてのxmlタグを削除する必要がありますが、テキストコンテンツは次のように同じオフセットにとどまるXMLで。これはJavaで行う必要があり、私はRegExpが行く方法だと思ったが、私の正規表現にマッチするタグの長さを取得する簡単な方法がないことが分かった。RegExpを使用してXMLタグを空白(タグの長さ)に置き換えます

基本的に私が欲しいものはこれです:

Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); 
Matcher m = p.matcher(stringWithXMLContent); 
String strippedContent = m.replaceAll("THIS IS A STRING OF WHITESPACES IN THE LENGTH OF THE MATCHED TAG"); 

は、誰かが私には簡単な方法でこれを行うために役立つことを願って!

+3

なぜ、オハイオ州、なぜ、正規表現は文字と関係があるすべての解決策だと誰もが考えているのですか? : – Bombe

+1

ほとんどの時間はそうだからね;;) – jhoff

答えて

1
Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); 

は、正規表現でXMLを解析できない、あなたは右、それは任意のXMLのための適切なパターンではないと知っているのですか? (それは、例えば、他の非タグ構造はもちろんのこと、属性値の>文字を持っていることは完全に有効です。)

私は定期的に一致するタグの長さを取得する簡単な方法を見つけていません表現。

replaceAllを使用する代わりに、Matcherでfindを繰り返し呼び出します。次に、start/endを読み込んで置換するインデックスを取得したり、バッファ上でappendReplacementメソッドを使用したりすることができます。例えば。

StringBuffer b= new StringBuffer(); 
while (m.find()) { 
    String spaces= StringUtils.repeat(" ", m.end()-m.start()); 
    m.appendReplacement(b, spaces); 
} 
m.appendTail(b); 
stringWithXMLContent= b.toString(); 

(のStringUtilsは、Apache Commonsのから来ている。より多くの背景とライブラリのない選択肢がthis questionを参照してください。)XMLプルパーサーを使用し、単にあなたがそれに遭遇として保存しておきたいすべてのものをエコーないのはなぜ

+0

ありがとう、これはまさにMatcher Iの機能です探していた! – jhoff

4

<>の文字はXMLの開始タグと終了タグを常に囲んでいるため、これは簡単なステートマシンでは簡単です。文字列には格納されていない書き込み可能な形式ですべての文字をループするだけで、<が表示された場合は、置換モードを有効にして、>に遭遇するまですべての文字を空白に置き換えます。 (最初の<と終了>の両方を置き換えてください)。

レイアウトを気にする人は、タブ文字や改行文字を置き換えないでください。あなたが心配しているのは全体的な文字列の長さですが、それは明らかに重要ではありません。

編集:コメント、処理手順、および/またはCDataセクションをサポートしたい場合は、これらも明示的に認識する必要があります。残念なことに属性値には>も含めることができます。これはすべて本格的な実装がより複雑になることを意味します。

通常のトランスデューサはこの作業には最適です。残念ながら、それらが正確に一般クラスライブラリで発見されていません...あなたの精神で

+1

これは基本的には機能しますが、いくつかのタグの周りにコメントがあると

+0

申し訳ありませんが、bobinceの投稿を見落としました –

0
**string**.replaceAll("(</?[a-zA-Z]{1}>)*", "") 

あなたもこれを試すことができます。 <を検索した後に/ 0または1の出現を検索した後、文字のみを1(小文字または大文字)にしてから、このパターンが複数現れるように>、*を続けます。

関連する問題