当前位置:  开发笔记 > 编程语言 > 正文

如何在正则表达式中跨多行匹配任何字符?

如何解决《如何在正则表达式中跨多行匹配任何字符?》经验,为你挑选了11个好方法。

例如,这个正则表达式

(.*)

将匹配:

abcde

但是如何让它在多行中匹配呢?

abcde
fghij

levik.. 318

试试这个:

((.|\n)*)

它基本上说"任何字符或换行符"重复零次或多次.



1> levik..:

试试这个:

((.|\n)*)

它基本上说"任何字符或换行符"重复零次或多次.


根据您的行结尾,您可能需要`((.| \n |\r)*)`
这是匹配多行输入的最差正则表达式.除非您使用ElasticSearch,否则请不要使用它.使用`[\ s\S]*`或`(?s).*`.
对 - 问题是关于日食,标签也是如此.但是,公认的解决方案是PHP解决方案.你的应该是公认的解决方案......
这取决于您使用的语言和/或工具.请告诉我们您使用的是什么,例如Perl,PHP,CF,C#,sed,awk等.
他说他正在使用Eclipse.在我看来,这是正确的解决方案.我有同样的问题,这解决了它.

2> Jeremy Ruten..:

这取决于语言,但应该有一个可以添加到正则表达式模式的修饰符.在PHP中它是:

/(.*)/s

最后的s使得点匹配包括换行符在内的所有字符.


@Allen - JavaScript不支持`s`修饰符.相反,为了相同的效果做`[^]*`.
s标志(现在?)无效,至少在Chrome/V8中是这样.而是使用/([\ s\S]*) /字符类(匹配空格和非空格)而不是句点匹配器.有关详细信息,请参阅其他答案.
@Grace:使用\n来匹配换行符

3> Wiktor Strib..:

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

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

在另一方面MATLAB和八度:在.匹配默认(任何字符演示): str = "abcde\n fghij"; expression = '(.*)*'; [tokens,matches] = regexp(str,expression,'tokens','match');(tokensabcde\n fghij项目).

此外,在所有boost的正则表达式语法中,默认情况下,点匹配换行符.Boost的ECMAScript语法允许你用regex_constants::no_mod_m(源)关闭它.

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

基于POSIX的引擎:

仅仅.已经匹配换行符,不需要使用任何修饰符,请参阅bash(演示).

的TCL(演示),PostgreSQL的(演示),- [R(TRE,基础R没有默认设置引擎perl=TRUE,用于与基础R perl=TRUEstringr/stringi图案,使用(?s)内联改性剂)(演示)也可治疗.相同的方式.

但是,大多数基于POSIX的工具逐行处理输入.因此,.仅因为它们不在范围内而与换行符不匹配.以下是一些如何覆盖此示例的示例:

sed - 有多种解决方法,最精确但不太安全的是sed 'H;1h;$!d;x; s/\(.*\)>/\1/'(H;1h;$!d;x;将文件丢入内存).如果必须包括整行,则可以考虑sed '/start_pattern/,/end_pattern/d' file(从开始删除将以包括匹配的行结束)或sed '/start_pattern/,/end_pattern/{{//!d;};}' file(排除匹配的行).

perl - perl -0pe 's/(.*)/$1/gs' <<< "$str"(-0将整个文件粘贴到内存中,-p在应用给定的脚本后打印文件-e).请注意,使用-000pe将slurp文件并激活'段落模式',其中Perl使用连续的换行符(\n\n)作为记录分隔符.

gnu-grep - grep -Poz '(?si)abc\K.*?(?=)' file.在这里,z启用文件slurping,(?s)为模式启用DOTALL模式.,(?i)启用不区分大小写的模式,\K省略到目前为止匹配的文本,*?是一个惰性量词,(?=)匹配之前的位置.

pcregrep - pcregrep -Mi "(?si)abc\K.*?(?=)" file(M允许文件在这里啜饮).注意pcregrep是Mac OS grep用户的一个很好的解决方案.

看演示.

基于非POSIX的引擎:

PHP的 -使用s修改PCRE_DOTALL修饰符:preg_match('~(.*)~s', $s, $m)(演示)

c# - 使用RegexOptions.Singleline标志(演示):
- var result = Regex.Match(s, @"(.*)", RegexOptions.Singleline).Groups[1].Value;
-var result = Regex.Match(s, @"(?s)(.*)").Groups[1].Value;

powershell - 使用(?s)内联选项:$s = "abcde`nfghij"; $s -match "(?s)(.*)"; $matches[1]

perl - 使用s修饰符(或(?s)开头的内联版本)(演示):/(.*)/s

python - 使用re.DOTALL(或re.S)标志或(?s)内联修饰符(演示):( m = re.search(r"(.*)", s, flags=re.S)然后if m:,print(m.group(1)))

java - 使用Pattern.DOTALL修饰符(或内联(?s)标志)(演示):Pattern.compile("(.*)", Pattern.DOTALL)

groovy - 使用(?s)模式内修饰符(演示):regex = /(?s)(.*)/

scala - 使用(?s)修饰符(演示):"(?s)(.*)".r.findAllIn("abcde\n fghij").matchData foreach { m => println(m.group(1)) }

javascript - 使用[^]或解决方法[\d\D]/ [\w\W]/ [\s\S](演示):s.match(/([\s\S]*)/)[1]

c ++(std::regex)使用[\s\S]或JS变通方法(演示):regex rex(R"(([\s\S]*))");

vba - 使用与JavaScript相同的方法([\s\S]*).

ruby - 使用/m MULTILINE修饰符(演示):s[/(.*)/m, 1]

走- (?s)在开始时使用内联修饰符(演示):re: = regexp.MustCompile(`(?s)(.*)`)

swift - 使用dotMatchesLineSeparators或(更简单)将(?s)内联修饰符传递给模式:let rx = "(?s)(.*)"

objective-c - 与Swift相同,(?s)工作最简单,但这里是如何使用该选项:NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:®exError];

re2,谷歌 - 应用程序 - 脚本- 使用(?s)修饰符(演示):( "(?s)(.*)"在Google Spreadsheets中=REGEXEXTRACT(A2,"(?s)(.*)"))

注意事项(?s):

在大多数非POSIX引擎中,(?s)可以使用内联修饰符(或嵌入式标记选项)来强制.匹配换行符.

如果放置在模式的开头,则(?s)更改模式中所有.的行为.如果(?s)它位于开头之后的某个位置,那么只有.位于其右侧的那些会受到影响,除非这是传递给Python的模式re.在Python中re,无论(?s)位置如何,整个模式都会.受到影响.该(?s)效果被停止使用(?-s).修改后的组可用于仅影响正则表达式模式的指定范围(例如,Delim1(?s:.*?)\nDelim2.*.*?跨越换行符进行第一次匹配,而第二次.*匹配将仅匹配行的其余部分).

POSIX说明:

在非正则表达式引擎中,为了匹配任何char,可以使用[\s\S]/ [\d\D]/ [\w\W]构造.

在POSIX中,[\s\S]不匹配任何char(如在JavaScript或任何非POSIX引擎中),因为括号表达式中不支持正则表达式转义序列.[\s\S]被解析为匹配单个字符,即方括号表达式\sS.


您应该从您的个人资料页面链接到这个优秀的概述(+1).
@PasupathiRajamanickam Bash使用POSIX正则表达式引擎,`.`匹配那里的任何字符(包括换行符).参见[此在线Bash演示](https://ideone.com/d1XTpR).

4> Paulo Merson..:

如果您正在使用Eclipse搜索,则可以启用"DOTALL"选项以生成"." 匹配任何字符,包括行分隔符:只需在搜索字符串的开头添加"(?s)".例:

(?s).*


这不是eclipse特定的,应该在任何地方工作.

5> 小智..:

在JavaScript中,使用/[\S\s]*/.资源


从该链接:"JavaScript和VBScript没有选项使点匹配换行符.在这些语言中,您可以使用[\ s\S]等字符类来匹配任何字符." 而不是.使用[\ s\S](匹配空格和非空格)代替.

6> samwize..:

([\s\S]*)

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



7> 小智..:

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

/YOUR_REGEXP/m

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



8> Nambi_0915..:

我们也可以使用

(.*?\n)*?

匹配一切,包括没有贪婪的换行

这将使新行可选

(.*?|\n)*?



9> Markus Jarde..:

"."通常不符合换行符.大多数正则表达式引擎允许您添加S-flag(也称为DOTALLSINGLELINE)以使"."匹配换行符.如果失败了,你可以做类似的事情[\S\s].



10> 小智..:

对于Eclipse,使用以下表达式:

jadajada酒吧"

正则表达式:

Foo[\S\s]{1,10}.*Bar*



11> Bill..:
/(.*)/s

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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有