我在文字文件中有以下内容
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="">
正则表达式是否有一种方法可以在匹配时忽略行间字符结束?
答案 0 :(得分:8)
如果您希望dot (.)
也匹配newline
,则可以使用Pattern.DOTALL
标记。另外,在String.replaceAll()
的情况下,您可以在模式的开头添加(?s)
,这相当于此标志。
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");
答案 2 :(得分:1)
您需要使用Pattern.DOTALL
模式。
replaceAll()
不会将模式标志作为单独的参数,但您可以在表达式中启用它们,如下所示:
expectedString = inputString.replaceAll("(?s)\\<img.*?cid:part123.*?>", ...);
但请注意,使用正则表达式解析HTML并不是一个好主意。最好使用HTML解析器。