在正则表达式中,在多行模式下,^
和$
代表行的开头和结尾。如何匹配整个字符串的结尾?
在字符串
中Hello\nMary\nSmith\nHello\nJim\nDow
表达式
/^Hello(?:$).+?(?:$).+?$/ms
匹配Hello\nMary\Smith
。
我想知道是否有一个元字符(如\ENDSTRING
)匹配整个字符串的结尾,而不仅仅是行,这样
/^Hello(?:$).+?(?:$).+?\ENDSTRING/ms
将匹配Hello\nJim\nDow
。同样,一个元字符匹配整个字符串的开头,而不是一行。
答案 0 :(得分:4)
\A
仅在字符串
的开头匹配\Z
仅在字符串结尾处或在结尾处的换行符之前匹配...
\A
和\Z
就像^
和$
一样,只是在使用/m
修饰符时它们不会多次匹配,而^
和$
将在每个内部线边界匹配。要匹配字符串的实际结束而不忽略可选的尾随换行符,请使用\z
。
另见Assertions in perlbackslash。
我不确定你在你的例子中是什么,所以这里是另一个
perl -wE'$_ = qq(one\ntwo\nthree); say for /(\w+\n\w+)\Z/m'
打印
two three
与$
而不是\Z
同时打印行one
和two
。
请注意,上面的示例也会匹配qq(one\ntwo\three\n)
(使用尾随换行符),可能适合或不适合。请根据您的实际需要,从上述报价中比较\Z
和\z
。感谢ikegami发表评论。
答案 1 :(得分:2)
\A
和\z
始终分别匹配字符串的开头和结尾。
without /m with /m
\A Beginning of string Beginning of string
^ \A \A|(?<=\n)
\z End of string End of string
\Z \z|(?=\n\z) \z|(?=\n\z)
$ \z|(?=\n\z) \z|(?=\n)
换句话说,
┌─────────────────── `\A` and `^`
│ ┌───────────── `(?m:$)`
│ │ ┌─────────── `(?m:^)`
│ │ │ ┌───── `\Z` and `$`
│ │ │ │ ┌─── `\z`, `\Z` and `$`
│ │ │ │ │
F o o ␊ B a r ␊
请记住,所有这些匹配都是零长度。