2011-06-27 33 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 = input.replaceAll("<object classid=\"java:com.sun.java.help.impl.JHSecondaryViewer.*?object>", "buh bye!"); 

很明顯,它不工作。但是,如果我使用pattern.compile和Pattern.DOTALL,我可以獲得模式匹配。

所以,我的問題是 - 我怎麼能做一些像Pattern.DOTALL與string.replaceall?

+1

啊哈! 找到內聯標誌「(?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