2011-01-26 14 views
1

の間でテキストを削除する方法ドキュメント内のhtmlタグ内にテキストがあります。テキストは、私が囲むタグと一緒に不要なテキストを削除どのようにこの< refと</ref >

I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too 

I need this text &lt;ref Some random text /&gt; I need this text too 

ようになりますか?


この正規表現を使用しようとしました。しかし、それは動作していません。 Javaでこの方法を試し

&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt; 

&lt;ref(.*?)&gt; 

を助けていません。

regex = "&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt;"; 
p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE); 
m = p.matcher(s); 
while(m.find()){ 
    m.replaceAll(" ");   
} 

任意のアイデアはどのように私は解決策を得るのですか?

+0

実際のHTMLタグが、私は、XMLタグ内のHTML形式のデータを持っていることを追加するために逃した< –

+0

のようなエンティティの識別子を使用しません。 xmlタグを解析し、htmlデータを取得しました。このうち、不要なhtmlタグを削除する必要があります。これは、HTMLデータタグが<および> –

答えて

2

まず、HTMLパーサーを使用します。 HTMLが複雑になると、正規表現は確実にこのタスクを処理できません。

第二に、あなたの正規表現は、整形ようだと簡単な例でwork as expectedは(私が<&lt;を変更したら、それはですが、私は質問を投稿するときにStackOverflowのは、それを誤って解釈するだろうと考えて、その変更をした疑いがあります)。この問題は、正規表現そのものではなく、Javaコード内にある可能性があります。私は、Javaの正規表現のAPIに精通していないので、私は他の誰かがその上で重させていただきます:)

+0

のような理由です。JavaのPatternクラスまたはStringクラスには制限があるようです。同じ正規表現はhttp://regexpal.comで動作するようです。しかし、私のJavaコードでは、それはうまくいきません! –

0
  1. HTMLは、正規表現should be avoidedで解析します。

  2. あなたの名前は比較的単純なものなので、私たちはそれに行きましょう。あなたは実際のHTMLと一致しているので、&lt;がほしいとは思わないので、実際には<&gt;>)が欲しいです。

    <ref[^>]*/>|<ref>[^<]*</ref> 
    

    は限り私は認識していますトリックを行う必要があり、それに/をエスケープする必要があります場合ので、私は知りませんが、私はJavaで正規表現を使用していません。

0

文字列は、他の「文字列変異」法のような、新たな文字列として結果を返し、そうreplaceAll()、不変です。

String[] ss = { 
    "I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too", 
    "I need this text &lt;ref Some random text /&gt; I need this text too" 
}; 

String r = "&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt;|&lt;ref(.*?)&gt;"; 

Pattern p = Pattern.compile(r, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
for (String s0 : ss) 
{ 
    Matcher m = p.matcher(s0); 
    String s1 = m.replaceAll(""); 
    System.out.printf("%n%s%n%s%n", s0, s1); 
} 

出力:

I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too
I need this text I need this text too

I need this text &lt;ref Some random text /&gt; I need this text too
I need this text I need this text too

他のいくつかの注意事項:

  • 私はあなたの正規表現を統合したとき、私はの最初の代替として長いものを使用しなければなりませんでした。その順序で試行することが重要です。なぜなら、短いタグ(空タグ/自己閉じタグ)は、通常のタグで一致させることができるからです。

  • find()に電話する必要はありません。最初のものはreplaceAll()です。一致するものがなければ、元の文字列を返します。あなたの正規表現(または鉱山中)にはラインアンカー(^$)がないので、

  • MULTILINEフラグは、有益な何かをやっていませんでした。

関連する問題