2011-06-27 15 views
15

Bazı öğeler almaya çalıştığım çok satırlı bir HTML belgesine sahibim. Ben java'nın regex kullanıyorum (Ben biliyorum - XML ​​parsers bla bla bla, sadece benimle burada ayı lütfen :)).Pattern.DOTALL ile 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 

Bu HTML'yi bir dizede: girdim.

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

Açıkçası, işe yaramıyor. Ben Pattern.DOTALL ile pattern.compile kullanırsanız, bir desen eşleşmesi alabilirsiniz.

Yani, sorum şu: string.replaceall ile Pattern.DOTALL gibi bir şeyi nasıl yapabilirim?

+1

Aha! Satır içi bayrağını "(? S)" olarak bulundu. Eğer regexin en başında yerleştirirseniz, DOTALL eşdeğeridir. Sorun çözüldü. – guywhoneedsahand

+0

Bu büyük bir sorun mu? "Pattern.compile" vb. Diye bir çağrı yapamaz mısın, yoksa bir sarıcı yazamaz mısın? –

+1

Desen çalışmasına '(? S)' yazıyor mu? Java konusunda emin değil, başka dillerde çalışır. – ninjalj

cevap

28

deseniniz önüne (?s) takın:

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

Javadoc Gönderen:

dotall modu da gömülü bayrak ifadesi (?s) aracılığıyla etkinleştirilebilir. (s bu Perl denen şeydir "tek hat" modunda, bir anımsatıcı olduğunu.)

Diğer bayrakları yanı

Özel yapım (non-yakalama) bu şekilde çalışan

kapalı -

...

(?idmsux-idmsux) şey yok, ama maç bayrakları üzerinde idmsux döner

Bir yan notda, hedefiniz güvenilmeyen bir nesneyi güvenilir olmayan bir kaynaktan HTML'den kaldırmaksa, lütfen normal ifadeler kullanmayın ve lütfen blacklist etiketlerini kullanmayın.

+1

+1 çok havalı bir ipucu! – Bohemian

İlgili konular