如何在正则表达式中跨多行匹配任何字符?
例如,此正则表达式
(.*)<FooBar>
将匹配:
abcde<FooBar>
但是我如何才能使其跨多行匹配?
abcde fghij<FooBar>
解决方案
在语言中使用时,正则表达式作用于字符串而不是行。因此,假设输入字符串有多行,我们应该能够正常使用正则表达式。
在这种情况下,给定的正则表达式将匹配整个字符串,因为存在" <FooBar>"。取决于正则表达式实现的细节,$ 1值(从"(。*)"获得)将是" fghij"或者" abcde \ nfghij"。正如其他人所说,某些实现允许我们控制是否为"。"。将与换行符匹配,为我们提供选择。
基于行的正则表达式通常用于命令行,例如egrep。
它取决于语言,但是应该有一个可以添加到正则表达式模式的修饰符。在PHP中是:
/(.*)<FooBar>/s
末尾的s使点匹配所有字符,包括换行符。
试试这个:
((.|\n)*)<FooBar>
它基本上说"任何字符或者换行符"重复零次或者多次。
" .."通常与换行符不匹配。大多数正则表达式引擎允许我们添加S
标志(也称为DOTALL
和SINGLELINE
)以使"。"也与换行符匹配。 如果失败,可以执行类似[[\ S \ s]
的操作。
一般来说 。与换行符不匹配,因此请尝试`((。| \ n)*)<foobar>
/(.*)<FooBar>/s
s使点(。)匹配回车符
请注意,((。| \ n)*的效率可能不及(例如)[\ s \ S] *
(如果语言正则表达式支持此类转义符),则效率可能不及寻找如何指定make的修饰符。还匹配换行符。或者,我们可以使用POSIXy替代方案,例如[[:: space:] [:^ space:]] *
。
我遇到了同样的问题,并以最佳方法解决了它,但它确实可行。在进行真正的比赛之前,我替换了所有换行符:
mystring= Regex.Replace(mystring, "\r\n", "")
我正在处理HTML,因此在这种情况下,换行符对我而言并不重要。
我没有运气就尝试了上面的所有建议,但我使用的是.Net 3.5 FYI
使用RegexOptions.Singleline,它更改的含义。包括换行符
Regex.Replace(content,searchText,replaceText,RegexOptions.Singleline);