【问题标题】:Ignoring the line break in regex?忽略正则表达式中的换行符?
【发布时间】:2012-11-06 10:31:23
【问题描述】:

我在文本文件中有以下内容

  some texting content <img  src="cid:part123" alt=""> <b> Test</b>

我从文件中读取它并将其存储在字符串中,即 inputString

   expectedString = inputString.replaceAll("\\<img.*?cid:part123.*?>",
    "NewContent");

我得到预期的输出,即

     some texting content NewContent <b> Test</b>

基本上,如果在 img 和 src 之间有行尾字符,如下所示,它不起作用,例如下面

 <img  
          src="cid:part123" alt="">

有没有办法正则表达式在匹配时忽略行尾字符?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    如果你想让你的dot (.) 也匹配newline,你可以使用Pattern.DOTALL 标志。或者,如果是String.replaceAll(),您可以在模式的开头添加(?s),这相当于这个标志。

    来自Pattern.DOTALL - JavaDoc:-

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

    所以,你可以像这样修改你的模式:-

    expectedStr = inputString.replaceAll("(?s)<img.*?cid:part123.*?>", "Content");
    

    注意:-您无需转义您的angular bracket(&lt;)

    【讨论】:

    • 嘿 Rohit 你能帮我处理一下stackoverflow.com/questions/13865750/…。这是一个仅与上述问题相关的问题,但当我有两个 img 标签时,不知何故没有得到预期的结果。看看你能不能帮忙。提前致谢
    【解决方案2】:

    默认情况下,. 字符不会匹配换行符。您可以通过指定Pattern.DOTALL flag 来启用此行为。在String.replaceAll() 中,您可以通过将(?s) 附加到您的模式前面来做到这一点:

    expectedString = inputString.replaceAll("(?s)\\<img.*?cid:part123.*?>", 
        "NewContent");
    

    另见Pattern.DOTALL with String.replaceAll

    【讨论】:

      【解决方案3】:

      你需要使用Pattern.DOTALL模式。

      replaceAll() 不将模式标志作为单独的参数,但您可以在表达式中启用它们,如下所示:

      expectedString = inputString.replaceAll("(?s)\\<img.*?cid:part123.*?>", ...);
      

      但是请注意,使用正则表达式解析 HTML 并不是一个好主意。改用 HTML 解析器会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多