Yeni satırlar dahil herhangi bir karakterle eşleşecek şekilde normal ifade


224

"Yeni satırlar dahil tüm karakterlerin" eşleşmesi için bir normal ifade var mı?

Örneğin, aşağıdaki normal ifadede, hiçbir çıkış yoktur $2çünkü (.+?)eşleşirken yeni satırlar içermez.

$string = "START Curabitur mollis, dolor ut rutrum consequat, arcu nisl ultrices diam, adipiscing aliquam ipsum metus id velit. Aenean vestibulum gravida felis, quis bibendum nisl euismod ut. 

Nunc at orci sed quam pharetra congue. Nulla a justo vitae diam eleifend dictum. Maecenas egestas ipsum elementum dui sollicitudin tempus. Donec bibendum cursus nisi, vitae convallis ante ornare a. Curabitur libero lorem, semper sit amet cursus at, cursus id purus. Cras varius metus eu diam vulputate vel elementum mauris tempor. 

Morbi tristique interdum libero, eu pulvinar elit fringilla vel. Curabitur fringilla bibendum urna, ullamcorper placerat quam fermentum id. Nunc aliquam, nunc sit amet bibendum lacinia, magna massa auctor enim, nec dictum sapien eros in arcu. 

Pellentesque viverra ullamcorper lectus, a facilisis ipsum tempus et. Nulla mi enim, interdum at imperdiet eget, bibendum nec END";

$string =~ /(START)(.+?)(END)/;

print $2;

1
Regex değiştiricileri / bayrakları hakkında aşağıdakileri okumak isteyebilirsiniz: m, s (m / regex /
ims

Yanıtlar:


195

Yeni satırlarla eşleşmesi için sdeğiştiriciyi normal ifadenize ekleyin .:

$string =~ /(START)(.+?)(END)/s;

32
JavaScript
dilinde

1
@ Zymotik adlı kullanıcının yorumu hakkında daha fazla bilgi için, bkz. Stackoverflow.com/questions/1068280/…
Jacob van Lingen

2
Java'da regex'in başındaki satır içi değiştiriciyi (? S) kullanabilirsiniz, örneğin 'yourPattern' kullanımından sonra yeni satırlar da dahil olmak üzere herhangi bir karakteri değiştirmek için "(?s)yourPattern.*"- Ayrıca bkz: rexegg.com/regex-modifiers.html#dotall
LukeSolar

Ruby'de değiştirici mdeğil s. Bakınız: rubular.com
Jon Schneider

312

/sNormal ifade değiştiricisini eklemek istemiyorsanız (belki de normal ifadesini normal ifadenin .başka bir yerinde tutmak istiyorsanız ), bir karakter sınıfı da kullanabilirsiniz. Bir olasılık:

[\S\s]

boşluk olmayan veya boşluk olan bir karakter. Başka bir deyişle, herhangi bir karakter.

Düzenleyicileri regex'in küçük bir bölümünde yerel olarak da değiştirebilirsiniz, şöyle:

(?s:.)

2
+1 (?s:.)Kendim sözdizimiyle uğraşmak üzereydim .
BoltClock

Daha (?:.|\n)az zarif olmak dışında herhangi bir şekilde düşük mü?
Vlastimil Ovčáčík

([\S\s]+)aradığım şey bu. Teşekkürler. +1
Ryan

@ VlastimilOvčáčík Eğer ile kullanırsanız *veya +2 ^ n farklı yol olduğu için çalışma zamanı için gerçekten kötü olabilir, çünkü n herhangi bir uzunluk dizesiyle eşleşebilir.
Radon Rosborough

8

Evet, sadece .yeni satır eşleştirmesi gerekiyor :

$string =~ /(START)(.+?)(END)/s;

-5

"Çok satırlı" kullanmak istiyorsunuz.

$string =~ /(START)(.+?)(END)/m;

6
Hayır, metkiler ^ve $çapa ama ..
BoltClock

İlginç, teşekkürler. Sanırım OP'nin ne istediğini tam olarak yapmaya çalışmadım.
nadime
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.