2017-10-08 6 views
1

Dans une expression régulière, en mode multiligne, ^ et $ représentent le début et la fin de la ligne. Comment puis-je faire correspondre la fin de la chaîne entière?Expression régulière pour début et fin de chaîne en mode multiligne

Dans la chaîne

Hello\nMary\nSmith\nHello\nJim\nDow 

l'expression

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

matchs Hello\nMary\Smith.

Je me demande s'il y a un métacaractère (comme \ENDSTRING) qui correspond à la fin de la chaîne, pas seulement la ligne, de sorte que

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

sélectionnne Hello\nJim\nDow. De même, un métacaractère correspond au début de la chaîne entière, pas une ligne.

Répondre

3

Il existe en effet assertions (perlre) pour que

\A match seulement au début de la chaîne
\Z match seulement à la fin de chaîne, ou avant newline à la fin

...
Le \A et \Z sont juste comme ^ et $, sauf qu'ils ne correspondront pas plusieurs fois lorsque le /m mod ifier est utilisé, alors que ^ et $ correspondent à chaque limite de ligne interne. Pour correspondre à la fin réelle de la chaîne et ne pas ignorer une nouvelle ligne de fin facultative, utilisez \z.

Voir aussi Assertions in perlbackslash.

Je ne sais pas ce que vous êtes après dans votre exemple alors voici un autre

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

impressions

 
two 
three 

alors qu'avec $ au lieu de \Z imprime des lignes one et two.


Notez que l'exemple ci-dessus correspond qq(one\ntwo\three\n) aussi bien (avec une nouvelle ligne de fuite), ce qui peut ou peut ne pas convenir. S'il vous plaît comparer \Z et \z de la citation ci-dessus pour vos besoins réels. Merci à ikegami pour un commentaire.

1

\A et \z correspondent toujours au début et à la fin de la chaîne, respectivement.

 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) 

En d'autres termes,

┌─────────────────── `\A` and `^` 
│  ┌───────────── `(?m:$)` 
│  │ ┌─────────── `(?m:^)` 
│  │ │  ┌───── `\Z` and `$` 
│  │ │  │ ┌─── `\z`, `\Z` and `$` 
│  │ │  │ │ 
F o o ␊ B a r ␊ 

Rappelez-vous, tous ces matchs sont de longueur nulle.