5

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

  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="">

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

4

3 回答 3

10

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

来自Pattern.DOTALL-JavaDoc:-

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

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

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

注意: -你不需要逃避你的angular bracket(<).

于 2012-11-06T10:37:26.853 回答
2

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

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

另请参见Pattern.DOTALL 和 String.replaceAll

于 2012-11-06T10:37:07.990 回答
1

您需要使用Pattern.DOTALL模式。

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

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

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

于 2012-11-06T10:36:08.757 回答