2017-10-08 141 views
1

在多行模式下,正則表達式中,^$表示行的開始和結束。我怎樣才能匹配整個字符串的結尾?多行模式下字符串開始和結尾的正則表達式

在串

Hello\nMary\nSmith\nHello\nJim\nDow 

表達

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

匹配Hello\nMary\Smith

我不知道是否有元字符(如\ENDSTRING),整個字符串的結尾相匹配,不只是行,這樣

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

將匹配Hello\nJim\nDow。同樣,元字符匹配整個字符串的開始,而不是一行。

回答

3

確實有assertions (perlre)

\A只匹配在字符串的開頭
\Z只匹配在字符串的結尾,或在年底前換行

...
\A\Z就像^$,只是它們在/m mod時不會匹配多次使用ifier,而^$將在每個內部線邊界匹配。要匹配字符串的實際末尾並且不忽略可選的尾隨換行符,請使用\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

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

請記住,所有這些比賽都是零長度。

相關問題