如何在正则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
标志(也称为DOTALL
和SINGLELINE
)来制作"."
也匹配换行符。 如果失败了,你可以做一些类似[\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=TRUE
或stringr / stringi模式,见下面的php )( demo )。 一个仅仅.
已经匹配换行符,不需要使用任何修饰符。
非基于POSIX的引擎 :
- php – 使用
s
修饰符PCRE_DOTALL修饰符 :preg_match('~(.*)<Foobar>~s', $s, $m)
〜spreg_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:®exError];
- 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为与单个字符\
或s
或S
匹配的括号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>