2011-06-27 10 views
15

Mam wielowierszowy dokument HTML, z którego próbuję pobrać pewne rzeczy. Używam regex java (Wiem - parsery XML bla bla bla, po prostu proszę o mnie tutaj proszę :)).Pattern.DOTALL z 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 

Mam ten kod HTML w ciągu znaków: input.

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

Oczywiście to nie działa. JEDNAK, mogę uzyskać wzór dopasowania, jeśli używam pattern.compile z Pattern.DOTALL.

Moje pytanie brzmi - w jaki sposób mogę zrobić coś w stylu Pattern.DOTALL z string.replaceall?

+1

Aha! Znaleziono flagę "(? S)". Jest to odpowiednik DOTALL, jeśli umieścisz go na samym początku wyrażeń regularnych. Problem rozwiązany. – guywhoneedsahand

+0

Czy to poważny problem? Nie możesz po prostu zadzwonić do 'Pattern.compile' itd. Lub napisać opakowanie? –

+1

Czy przedrostek '(? S)' działa na wzór? Działa w innych językach, nie jest pewny, czy Java. – ninjalj

Odpowiedz

28

(?s) Dołączyć do przodu wzór:

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

Z Javadoc:

tryb dotall mogą być również włączone poprzez wbudowanego flagi ekspresji (?s). (The s jest pamięciowy dla trybu "single-linii", czyli to, co nazywa się w języku Perl.)

Inne flagi działa w ten sposób, jak również

konstrukcji specjalnych (non-przechwytywania)

...

(?idmsux-idmsux) Nic, ale okazuje flagi mecz idmsux on - off

Na marginesie, jeśli Twoim celem jest usunięcie niebezpiecznych obiektów z kodu HTML z niezaufanego źródła, nie używaj wyrażeń regularnych i nie używaj znaczników blacklist.

+1

+1 bardzo fajna wskazówka! – Bohemian

Powiązane problemy