【问题标题】:Pattern.DOTALL with String.replaceAllPattern.DOTALL 与 String.replaceAll
【发布时间】:2011-09-23 21:49:51
【问题描述】:

我有一个多行 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 之类的操作?

【问题讨论】:

  • 啊哈!找到内联标志“(?s)”。如果将它放在正则表达式的开头,它就相当于 DOTALL。问题解决了。
  • 这是一个大问题吗?你不能直接打电话给Pattern.compile 等等,或者写一个包装器吗?
  • 在模式前添加(?s) 是否有效?它适用于其他语言,不确定Java。

标签: java regex


【解决方案1】:

(?s) 附加到您的图案前面:

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

来自Javadoc

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

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

特殊构造(非捕获)

...

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

附带说明,如果您的目标是从不受信任的来源的 HTML 中删除不安全的对象,请不要使用正则表达式,也不要使用blacklist 标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多