忽略正则表达式中的换行符?

时间:2012-11-06 10:31:24

标签: java regex

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

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

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

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

我得到预期的输出,即

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

基本上如果img和src之间存在行尾字符,如下所示,它不适用于下面的示例

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

正则表达式是否有一种方法可以在匹配时忽略行间字符结束?

3 个答案:

答案 0 :(得分:8)

如果您希望dot (.)也匹配newline,则可以使用Pattern.DOTALL标记。另外,在String.replaceAll()的情况下,您可以在模式的开头添加(?s),这相当于此标志。

来自Pattern.DOTALL - JavaDoc: -

  

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

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

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

注意: - 您无需转义angular bracket(<)

答案 1 :(得分:2)

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

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

另见Pattern.DOTALL with String.replaceAll

答案 2 :(得分:1)

您需要使用Pattern.DOTALL模式。

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

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

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