如何在正则expression式的多行中匹配任何字符?

例如,这个正则expression式

(.*)<FooBar> 

将匹配:

 abcde<FooBar> 

但是,如何让它匹配多行?

 abcde fghij<FooBar> 

这取决于语言,但应该有一个修饰符,你可以添加到正则expression式模式。 在PHP中是:

 /(.*)<FooBar>/s 

最后的s导致点匹配包括换行符在内的所有字符。

尝试这个:

 ((.|\n)*)<FooBar> 

它基本上说“任何字符或换行符”重复零次或多次。

如果您使用的是Eclipsesearch,则可以启用“DOTALL”选项来创build“。”。 匹配任何字符,包括行分隔符:只要在searchstring的开头添加“(?s)”即可。 例:

 (?s).*<FooBar> 

在JavaScript中,使用/[\S\s]*<Foobar>/ 。 资源

([\s\S]*)<FooBar>

点匹配除换行符(\ r \ n)以外的所有内容。 所以使用\ s \ S,它会匹配所有的字符。

Ruby ruby中,你可以使用' m '选项(多行):

 /YOUR_REGEXP/m 

有关更多信息,请参阅ruby-doc.org上的Regexp文档 。

"." 通常不符合换行符。 大多数正则expression式引擎允许您添加S标志(也称为DOTALLSINGLELINE )来制作"." 也匹配换行符。 如果失败了,你可以做一些类似[\S\s]事情。

对于Eclipse工作以下expression式:

jadajada酒吧“

正则expression式:

 Foo[\S\s]{1,10}.*Bar* 
 /(.*)<FooBar>/s 

s导致Dot(。)匹配回车符

问题是,可以. 模式匹配任何字符? 答案因发动机而异。 主要区别在于该模式是由POSIX还是非POSIX正则expression式库使用。

关于lua-patterns的特别说明:它们不被视为正则expression式,但是. 匹配任何字符,与基于POSIX的引擎相同。

关于matlab和八度的另一个注意事项: 匹配默认的任何字符( 演示 ): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match'); str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');tokens包含abcde\n fghij项目)。

另外,在所有boost的正则expression式语法中,点默认匹配换行符。 Boost的ECMAScript语法允许您使用regex_constants::no_mod_m ( source )closures此function。

至于oracle (基于POSIX),使用n选项 ( demo ): select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual

基于POSIX的引擎

tcl ( demo ), postgresql ( demo ), r (TRE,base R默认引擎没有perl=TRUE ,对于base R, perl=TRUEstringr / stringi模式,见下面的php )( demo )。 一个仅仅. 已经匹配换行符,不需要使用任何修饰符。

非基于POSIX的引擎

  • php – 使用s修饰符PCRE_DOTALL修饰符 : preg_match('~(.*)<Foobar>~s', $s, $m) 〜s preg_match('~(.*)<Foobar>~s', $s, $m) ( demo )
  • c# – 使用RegexOptions.Singleline标志( 演示 ):
    var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
    var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
  • powershell – 使用(?s)内选项: $s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1] $s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
  • perl – 在开始处使用s修饰符(或(?s)内联版本)( demo ): /(.*)<FooBar>/s (.*)< /(.*)<FooBar>/s
  • python – 使用re.DOTALL (或re.S )标志或(?s)内联修饰符( demo ): m = re.search(r"(.*)<FooBar>", s, flags=re.S) (然后if m:print(m.group(1))
  • 使用Pattern.DOTALL修饰符(或内联(?s)标志)( 演示 ): Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
  • groovy – 使用(?s)模式修饰符( demo ): regex = /(?s)(.*)<FooBar>/
  • (?s)修饰符( demo ): "(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }
  • javascript – 使用[^]或解决方法[\d\D] / [\w\W] / [\s\S] ( demo ): s.match(/([\s\S]*)<FooBar>/)[1]
  • regex rex(R"(([\s\S]*)<FooBar>)");
  • vba – 使用与JavaScript相同的方法, ([\s\S]*)<Foobar>
  • ruby – 使用/m MULTILINE修饰符 ( demo ): s[/(.*)<Foobar>/m, 1]
  • 在开始( demo )中使用内联修饰符(?s)re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
  • swift – 使用dotMatchesLineSeparators或(更简单)将(?s)内联修饰符传递给模式: let rx = "(?s)(.*)<Foobar>"
  • Objective-C – 与Swift相同, (?s)工作最简单,但是这里是如何使用该选项 : NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:&regexError];
  • re2 , 谷歌应用程序脚本 – 使用(?s)修饰符( 演示 ): "(?s)(.*)<Foobar>" (在谷歌电子表格, =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>")

注意事项(?s)

在大多数非POSIX引擎中,可以使用(?s)内修饰符(或embedded标志选项)来强制执行. 匹配换行符。

如果放在模式的开头, (?s)改变了所有的行为. 在模式中。 如果(?s)放置在开始之后的某个位置,则只有这些. 将会受到影响,位于它的右边, 除非这是一个传递给Python的模式。 在Python中,无论(?s)位置如何,整个模式. 受到影响。 使用(?-s)停止(?s)效果。 修改后的组只能影响正则expression式模式的指定范围(例如Delim1(?s:.*?)\nDelim2.*将使换行符之间的第一个.*?匹配,第二个.*将只匹配其余部分)。

POSIX注意

在非正则expression式引擎中,为了匹配任何字符,可以使用[\s\S] / [\d\D] / [\w\W]结构。

在POSIX中, [\s\S]不匹配任何字符(如在JavaScript或任何非POSIX引擎中),因为在括号expression式中不支持正则expression式转义序列。 [\s\S]parsing为与单个字符\sS匹配的括号expression式。

请注意, (.|\n)*效率可能低于(例如) [\s\S]* (如果您的语言的正则expression式支持此类转义),而不是查找如何指定修改器。 也匹配换行符。 或者你可以用像[[:space:][:^space:]]*这样的POSIXy选项。

使用RegexOptions.Singleline,它改变的意思。 包括换行符

Regex.Replace(content,searchText,replaceText,RegexOptions.Singleline);

解:

使用模式修饰符sU将在PHP中获得所需的匹配。

例:

 preg_match('/(.*)/sU',$content,$match); 

资源:

http://dreamluverz.com/developers-tools/regex-match-all-including-new-line http://php.net/manual/en/reference.pcre.pattern.modifiers.php

在基于Java的正则expression式中,您可以使用[/ s / S]

在语言中使用的上下文中,正则expression式对string起作用,而不是行。 所以你应该能够正常使用正则expression式,假设inputstring有多行。

在这种情况下,给定的正则expression式将匹配整个string,因为存在“<FooBar>”。 取决于正则expression式实现的具体情况,$ 1值(从“(。*)”获得)将是“fghij”或“abcde \ nfghij”。 正如其他人所说,一些实现允许您控制是否“。” 将匹配换行符,给你select。

基于行的正则expression式通常用于像egrep这样的命令行。

我有同样的问题,解决它可能不是最好的方式,但它的工作原理。 在我做了真正的比赛之前,我取代了所有的换行符:

 mystring= Regex.Replace(mystring, "\r\n", "") 

我正在操纵HTML,所以在这种情况下,换行符对我来说并不重要。

我尝试了所有的build议,没有运气,我使用.net 3.5 FYI

我想在java中匹配一个特定的if块

  ... ... if(isTrue){ doAction(); } ... ... } 

如果我使用regExp

 if \(isTrue(.|\n)*} 

它包括方法块的右括号,所以我使用了

 if \(!isTrue([^}.]|\n)*} 

从通配符匹配中排除右括号。

通常,我们必须修改一个子string,并在子string前面加上几行关键字。 考虑一个xml元素:

 <TASK> <UID>21</UID> <Name>Architectural design</Name> <PercentComplete>81</PercentComplete> </TASK> 

假设我们要修改81,给其他一些值,比如说40.首先确定.UID.21..UID. ,然后跳过所有字符,包括\n直到.PercentCompleted. 。 正则expression式模式和replace规范是:

 String hw = new String("<TASK>\n <UID>21</UID>\n <Name>Architectural design</Name>\n <PercentComplete>81</PercentComplete>\n</TASK>"); String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)"); String replaceSpec = new String ("$1$2$440$6"); //note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2. String iw = hw.replaceFirst(pattern, replaceSpec); System.out.println(iw); <TASK> <UID>21</UID> <Name>Architectural design</Name> <PercentComplete>40</PercentComplete> </TASK> 

小组(.|\n)可能是缺less的组$3 。 如果我们使它不被(?:.|\n)捕获,那么$3就是(<PercentComplete>) 。 所以pattern和replaceSpec也可以是:

 pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)"); replaceSpec = new String("$1$2$340$5") 

和更换工作正常。

一般。 不匹配换行符,所以试试((.|\n)*)<foobar>