Regex เพื่อจับคู่อักขระใด ๆ รวมถึงบรรทัดใหม่


224

มี regex เพื่อจับคู่ "ตัวละครทั้งหมดรวมถึงการขึ้นบรรทัดใหม่"?

ตัวอย่างเช่นใน regex ด้านล่างไม่มีผลลัพธ์จาก$2เพราะ(.+?)ไม่รวมบรรทัดใหม่เมื่อจับคู่

$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 เช่น: m, s (m / regex / ims ... )
snoofkin

คำตอบ:


195

เพิ่มโมดิsฟายเออร์ใน regex ของคุณเพื่อให้.ตรงกับบรรทัดใหม่:

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

32
ใน JavaScript: (เริ่มต้น) [\ s \ S] * (END) - ดู www.regexpal.com เพื่อทดสอบ
Zymotik

1
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความคิดเห็นของ @ Zymotik โปรดดูที่: stackoverflow.com/questions/1068280/…
Jacob van Lingen

2
ใน Java คุณสามารถใช้ inline modifier (? s) ที่จุดเริ่มต้นของ regex ตัวอย่างเช่นเพื่อแทนที่ตัวอักษรใด ๆ รวมถึงการขึ้นบรรทัดใหม่หลังจากการใช้ 'yourPattern' "(?s)yourPattern.*"- ดูเพิ่มเติม: rexegg.com/regex-modifiers.html#dotall
LukeSolar

ในทับทิมปรับปรุงคือไม่m sดู: rubular.com
Jon Schneider

312

หากคุณไม่ต้องการเพิ่ม/sตัวปรับแต่ง regex (บางทีคุณอาจยังต้องการ.รักษาความหมายดั้งเดิมไว้ที่อื่นใน regex) คุณอาจใช้คลาสอักขระ ความเป็นไปได้หนึ่งอย่าง:

[\S\s]

อักขระที่ไม่ใช่ช่องว่างหรือเป็นช่องว่าง ในคำอื่น ๆ ตัวละครใด ๆ

คุณยังสามารถเปลี่ยนโมเดอเรเตอร์ในเครื่องในส่วนเล็ก ๆ ของ regex ดังนี้

(?s:.)

2
+1 ฉันเพิ่งจะชิปด้วย(?s:.)ไวยากรณ์ของตัวเอง
BoltClock

คือ(?:.|\n)ด้อยกว่าในทางใด ๆ ยกเว้นเป็นสง่างามน้อยลงหรือไม่
Vlastimil Ovčáčík

([\S\s]+)คือสิ่งที่ฉันกำลังมองหา ขอบคุณ +1
Ryan

@ VlastimilOvčáčíkนั่นอาจเป็นสิ่งที่ไม่ดีสำหรับ runtime ถ้าคุณใช้มันด้วย*หรือ+เนื่องจากมี 2 ^ n วิธีที่แตกต่างมันสามารถจับคู่กับสตริงที่มีความยาวที่กำหนด n
Radon Rosborough

8

ใช่แล้วคุณเพียงแค่ต้องทำการ.จับคู่ขึ้นบรรทัดใหม่:

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

-5

คุณต้องการใช้ "multiline"

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

6
ไม่mส่งผลกระทบต่อ^และ$เบรก .แต่ไม่
BoltClock

น่าสนใจขอบคุณ เดาฉันไม่เคยพยายามที่จะทำสิ่งที่ OP ขอ
nadime
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.