例如,这个正则表达式
(.*)
将匹配:
abcde
但是如何让它在多行中匹配呢?
abcde fghij
levik.. 318
试试这个:
((.|\n)*)
它基本上说"任何字符或换行符"重复零次或多次.
试试这个:
((.|\n)*)
它基本上说"任何字符或换行符"重复零次或多次.
这取决于语言,但应该有一个可以添加到正则表达式模式的修饰符.在PHP中它是:
/(.*)/s
最后的s使得点匹配包括换行符在内的所有字符.
问题是,可以.
模式匹配任何字符吗?答案因发动机而异.主要区别在于该模式是由POSIX还是非POSIX正则表达式库使用.
关于lua-patterns的特别说明:它们不被视为正则表达式,但.
匹配任何char,与基于POSIX的引擎相同.
在另一方面MATLAB和八度:在.
匹配默认(任何字符演示): str = "abcde\n fghij
(tokens
含abcde\n fghij
项目).
此外,在所有boost的正则表达式语法中,默认情况下,点匹配换行符.Boost的ECMAScript语法允许你用regex_constants::no_mod_m
(源)关闭它.
至于oracle(基于POSIX),使用n
选项(demo):select regexp_substr('abcde' || chr(10) ||' fghij
基于POSIX的引擎:
仅仅.
已经匹配换行符,不需要使用任何修饰符,请参阅bash(演示).
的TCL(演示),PostgreSQL的(演示),- [R(TRE,基础R没有默认设置引擎perl=TRUE
,用于与基础R perl=TRUE
或stringr/stringi图案,使用(?s)
内联改性剂)(演示)也可治疗.
相同的方式.
但是,大多数基于POSIX的工具逐行处理输入.因此,.
仅因为它们不在范围内而与换行符不匹配.以下是一些如何覆盖此示例的示例:
sed - 有多种解决方法,最精确但不太安全的是sed 'H;1h;$!d;x; s/\(.*\)>
(H;1h;$!d;x;
将文件丢入内存).如果必须包括整行,则可以考虑sed '/start_pattern/,/end_pattern/d' file
(从开始删除将以包括匹配的行结束)或sed '/start_pattern/,/end_pattern/{{//!d;};}' file
(排除匹配的行).
perl - perl -0pe 's/(.*)
(-0
将整个文件粘贴到内存中,-p
在应用给定的脚本后打印文件-e
).请注意,使用-000pe
将slurp文件并激活'段落模式',其中Perl使用连续的换行符(\n\n
)作为记录分隔符.
gnu-grep - grep -Poz '(?si)abc\K.*?(?=
.在这里,z
启用文件slurping,(?s)
为模式启用DOTALL模式.
,(?i)
启用不区分大小写的模式,\K
省略到目前为止匹配的文本,*?
是一个惰性量词,(?=
匹配之前的位置
.
pcregrep - pcregrep -Mi "(?si)abc\K.*?(?=
(M
允许文件在这里啜饮).注意pcregrep
是Mac OS grep
用户的一个很好的解决方案.
看演示.
基于非POSIX的引擎:
PHP的 -使用s
修改PCRE_DOTALL修饰符:preg_match('~(.*)
(演示)
c# - 使用RegexOptions.Singleline
标志(演示):
- var result = Regex.Match(s, @"(.*)
-var result = Regex.Match(s, @"(?s)(.*)
powershell - 使用(?s)
内联选项:$s = "abcde`nfghij
perl - 使用s
修饰符(或(?s)
开头的内联版本)(演示):/(.*)
python - 使用re.DOTALL
(或re.S
)标志或(?s)
内联修饰符(演示):( m = re.search(r"(.*)
然后if m:
,print(m.group(1))
)
java - 使用Pattern.DOTALL
修饰符(或内联(?s)
标志)(演示):Pattern.compile("(.*)
groovy - 使用(?s)
模式内修饰符(演示):regex = /(?s)(.*)
scala - 使用(?s)
修饰符(演示):"(?s)(.*)
javascript - 使用[^]
或解决方法[\d\D]
/ [\w\W]
/ [\s\S]
(演示):s.match(/([\s\S]*)
c ++(std::regex
)使用[\s\S]
或JS变通方法(演示):regex rex(R"(([\s\S]*)
vba - 使用与JavaScript相同的方法([\s\S]*)
.
ruby - 使用/m
MULTILINE修饰符(演示):s[/(.*)
走- (?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]
被解析为匹配单个字符,即方括号表达式\
或s
或S
.
如果您正在使用Eclipse搜索,则可以启用"DOTALL"选项以生成"." 匹配任何字符,包括行分隔符:只需在搜索字符串的开头添加"(?s)".例:
(?s).*
在JavaScript中,使用/[\S\s]*
.资源
([\s\S]*)
该点匹配除换行符之外的所有内容(\ r \n).所以使用\ s\S,它将匹配所有字符.
在Ruby ruby中,您可以使用' m
'选项(多行):
/YOUR_REGEXP/m
有关更多信息,请参阅ruby-doc.org上的Regexp文档.
我们也可以使用
(.*?\n)*?
匹配一切,包括没有贪婪的换行
这将使新行可选
(.*?|\n)*?
"."
通常不符合换行符.大多数正则表达式引擎允许您添加S
-flag(也称为DOTALL
和SINGLELINE
)以使"."
匹配换行符.如果失败了,你可以做类似的事情[\S\s]
.
对于Eclipse,使用以下表达式:
富
jadajada酒吧"
正则表达式:
Foo[\S\s]{1,10}.*Bar*
/(.*)/s
s导致Dot(.)匹配回车符