2013-04-02 10 views
6

私は次のJavaコードを持っています。中に、のJava XMLタグを取り除くために正規表現ではなく、コンテンツにタグを付ける

How now <fizz>brown</fizz> cow. 

How now cow. 

str = str.replaceAll("<.*?>.*?</.*?>|<.*?/>", ""); 

これはそうのような文字列をオン

ただし、<fizz></fizz>タグを削除するか、スタンドアロンのタグ</fizz>タグを使用し、要素のコンテンツだけを残します。だから、に上記を回すだろう正規表現:中に、

How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow. 

How now brown cow. 

あるいは、より複雑な文字列、ターンsomethngを使用して

How now brown cow. 

は、私はこれを試してみました:

str = str.replaceAll("<.*?></.*?>|<.*?/>", ""); 

これはまったく仕事。何か案は?前もって感謝します!

+0

通常、 'xml'と' regex'タグが一緒に表示されていると、あなたはコメントを得るでしょう。.... – Kent

+1

XMLパーサを使ってみましたか?私はXMLを解析するためにJDOMを使って私の人生をもっと簡単に見つけました。 –

+0

私は巨大なbackstoryに落ちることなく細部に入ることはできませんが、ここでは不可能です(XML Parser)。ちょうど正規表現のソリューションを探しています。 – IAmYourFaja

答えて

26
"How now <fizz>brown</fizz> cow.".replaceAll("<[^>]+>", "") 
+0

非常に効率的かつコンパクトです。 –

6

あなたはほとんどそこにあった。)

これを試してみてください:

str = str.replaceAll("<.*?>", "") 
+0

私はそれをNotepad ++でテストしたところ、完璧に動作しました。 – Johnny

2

あなたもこれを試すことができます。

str = str.replaceAll("<.*?>", ""); 

良くするために、以下の例を見てください。理解:

public class StringUtils { 

    public static void main(String[] args) { 
     System.out.println(StringUtils.replaceAll("How now <fizz>brown</fizz> cow.")); 
     System.out.println(StringUtils.replaceAll("How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow.")); 
    } 

    public static String replaceAll(String strInput) { 
     return strInput.replaceAll("<.*?>", ""); 
    } 
} 

出力:

How now brown cow. 
How now brown cow. 
+0

-1。角括弧( '<' and '>')は正規表現で特別な意味を持たないので、それらをエスケープするのは無意味です。実際、いくつかのフレーバー(しかしJavaではなく)では、 '\ <' and '\>'がワード境界にマッチするために使用されるため、この「解決策」は事態を悪化させます。 –

+0

ご意見ありがとうございます。ソリューションを更新しました... –

2

他の正解がありますが、どれも任意の説明を与えません。

正規表現<.*?>.*?</.*?>|<.*?/>が機能しない理由は、タグとその中のすべてのものを選択するためです。あなたはdebuggexのアクションでそれを見ることができます。それは、タグ以下の最初の終了タグまでのタグの最初から選択されますので、あなたの第二の試み<.*?></.*?>|<.*?/>は動作しません

理由があります。それは一種の一口ですが、何が起こっているのかをよく理解することができますin this example

必要な正規表現ははるかに簡単です:<.*?>。すべてのタグを選択して、それが開いているか閉じているかを無視します。 Visualization

関連する問題