Pattern.DOTALL with String.replaceAll

2022-09-02 01:10:40

我有一个多行HTML文档,我试图从中获取一些东西。我正在使用java的正则表达式(我知道 - XML解析器bla bla bla,请耐心等待我在这里:))。

    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.compile 和 Pattern.DOTALL,我可以得到一个模式匹配。

所以,我的问题是 - 我怎么能用string.replaceall做像Pattern.DOTALL这样的事情?


答案 1

附在图案的前面 :(?s)

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

来自 Javadoc

也可以通过嵌入式标志表达式启用 Dotall 模式。(这是“单行”模式的助记符,这就是Perl中所说的。(?s)s

其他标志也以这种方式工作

特殊构造(非捕获)

...

(?idmsux-idmsux)什么都没有,但打开匹配标志 i d m s u x - 关闭

另外,如果您的目标是从不受信任的源从HTML中删除不安全的对象,请不要使用正则表达式,也请不要将标签列入黑名单


答案 2