2011-06-27 3 views
15

私はいくつかのものを取得しようとしている複数行のHTML文書を持っています。私はjavaの正規表現を使用しています(私は知っている - XMLパーサはbla bla bla、ちょうどここに私と一緒にいてください:))。Pattern.DOTALL with String.replaceAll

dfahfadhadaaaa<object classid="java:com.sun.java.help.impl.JHSecondaryViewer" width="14" height="14"> 
<param name="content" value="../Glossary/glInterlinkedTask.html"> 

<param name="text" value="interlinked task"> 
<param name="viewerActivator" value="javax.help.LinkLabel"> 
<param name="viewerStyle" value="javax.help.Popup"> 
<param name="viewerSize" value="390,340"> 
<param name="textFontFamily" value="SansSerif"> 
<param name="textFontWeight" value="plain"> 
<param name="textFontStyle" value="italic"> 
<param name="textFontSize" value="12pt"> 
<param name="textColor" value="blue"> 

<param name=iconByID" value=""> 
</object> 
sjtsjsrjrsjsrjsrj 

私はこのHTMLを文字列に入力しました。

input = input.replaceAll("<object classid=\"java:com.sun.java.help.impl.JHSecondaryViewer.*?object>", "buh bye!"); 

明らかに、機能しません。しかし、Pattern.Detallでpattern.compileを使用すると、パターンマッチを得ることができます。

私の質問は、どうやってPattern.DOTALLのようなものをstring.replaceallで行うことができますか?

+1

Aha! インラインフラグ "(?s)"が見つかりました。これは正規表現の冒頭に置くとDOTALLに相当します。問題が解決しました。 – guywhoneedsahand

+0

これは大きな問題ですか?あなたは単に 'Pattern.compile'などを呼び出すことはできませんか、あるいはラッパーを書くことはできませんか? –

+1

パターン作業の前に '(?s)'が付いていますか?他の言語でも動作しますが、Javaについてはわかりません。 – ninjalj

答えて

28

あなたのパターンの前に(?s)を取り付けます

input = input.replaceAll("(?s)<object classid=\"java:com\\.sun\\.java\\.help\\.impl\\.JHSecondaryViewer.*?object>", "buh bye!"); 

Javadocから:

DOTALLモードは、埋め込みフラグ表現(?s)経由で有効にすることができます。 (sは、これはPerlで呼ばれているもので、「シングルライン」モード、のニーモニックです。)

他のフラグも同様

特殊構造(非キャプチャを)このように動作します

...

(?idmsux-idmsux)何もないが、一致フラグがオンidmsuxなります -

オフ

安全でないオブジェクトを信頼できないソースからHTMLから削除することを目標とする場合は、正規表現を使用しないでください。blacklistタグを使用しないでください。

+1

+1非常にクールな先端! – Bohemian