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

8

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

在字符串中:

Hello\nMary\nSmith\nHello\nJim\nDow

表达式

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

匹配 Hello\nMary\Smith

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

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

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

2个回答

11

确实有断言(perlre)可用于此目的。

\A 仅匹配字符串开头
\Z 仅匹配字符串结尾,或者在结尾处之前的换行符

...
\A\Z 就像 ^$ 一样,只是在使用 /m 修饰符时不会多次匹配,而 ^$ 则会在每个内部行边界处匹配。要匹配实际的字符串结尾并忽略可选的尾随换行符,请使用 \z

另请参见perlbackslash中的断言

我不确定您在所示示例中需要什么,因此这里提供另一个示例。

perl -wE'$_ = qq(one\ntwo\nthree); say for /(\w+\n\w+)\Z/m'

打印

二
三

但使用 $ 而不是 \Z 时,它会打印

一
二

请注意,上面的示例将匹配 qq(one\ntwo\three\n)(带有换行符),这可能适合也可能不适合您的实际需求。请根据您的实际需求比较上述引文中的 \Z\z。感谢ikegami的评论。


JavaScript 中的 \A 和 \Z 起作用吗?它们似乎不起作用。 - OsamaBinLogin
@OsamaBinLogin 不好意思,看起来JS确实没有这个功能。 - zdim

3

\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 ␊

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接