多行模式下字符串的开始和结束的正则表达式

时间:2017-10-08 00:00:08

标签: regex perl pcre

在正则表达式中,在多行模式下,^$代表行的开头和结尾。如何匹配整个字符串的结尾?

在字符串

Hello\nMary\nSmith\nHello\nJim\nDow

表达式

/^Hello(?:$).+?(?:$).+?$/ms

匹配Hello\nMary\Smith

我想知道是否有一个元字符(如\ENDSTRING)匹配整个字符串的结尾,而不仅仅是行,这样

/^Hello(?:$).+?(?:$).+?\ENDSTRING/ms

将匹配Hello\nJim\nDow。同样,一个元字符匹配整个字符串的开头,而不是一行。

2 个答案:

答案 0 :(得分:4)

确实有assertions (perlre)

  

\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同时打印行onetwo

请注意,上面的示例也会匹配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 ␊

请记住,所有这些匹配都是零长度。