รองรับ regex แบบหลายบรรทัดใน Vim


117

ฉันสังเกตเห็นว่าไวยากรณ์ regex มาตรฐานสำหรับการจับคู่ข้ามหลายบรรทัดคือการใช้ / s ดังนี้:

This is\nsome text
/This.*text/s

สิ่งนี้ใช้งานได้ใน Perl แต่ดูเหมือนจะไม่รองรับใน Vim แต่ฉันต้องเจาะจงมากขึ้น:

/This[^\r\n]*[\r\n]*text/

ฉันไม่พบเหตุผลใด ๆ ว่าทำไมจึงควรเป็นเช่นนี้ดังนั้นฉันคิดว่าฉันอาจพลาดบิตที่เกี่ยวข้องในความช่วยเหลือเป็นกลุ่ม

ใครสามารถยืนยันพฤติกรรมนี้ไม่ทางใดก็ทางหนึ่งได้หรือไม่?

คำตอบ:


177

ใช่//sตัวปรับแต่งของ Perl ไม่มีใน Vim regexes ดู:h perl-patternsรายละเอียดและรายการความแตกต่างอื่น ๆ ระหว่าง Vim และ Perl regexes

คุณสามารถใช้แทนได้\_.ซึ่งหมายความว่า "จับคู่อักขระเดี่ยวใด ๆ รวมถึงขึ้นบรรทัดใหม่" สั้นกว่าที่คุณมีอยู่เล็กน้อย ดู:h /\_..

/This\_.*text/

4
ดี - ชีวิตของฉันง่ายขึ้นเล็กน้อย ฉันจะทำ (. | \ n) *
ojrac

2
เครื่องหมายทับในการ:h /\_.ทำอะไร? ฉันหมายความว่าฉันรู้ว่ามันใช้งานได้ แต่ทำไมถึงได้:h /\_.ผลไม่ใช่:h \_.เหรอ?
แก้ไข

2
@ เพิ่มเครื่องหมายทับ (ซึ่งเป็นคีย์เริ่มต้นสำหรับการค้นหา) ระบุบริบท\_.ที่คุณสามารถอ่านได้เช่น: ขอความช่วยเหลือสำหรับนิพจน์การค้นหา \_.
Florian

อย่างไรก็ตามดูเหมือนว่าฉันไม่สามารถทำการจับคู่แบบขี้เกียจกับนิพจน์นี้ได้แม้ว่าฉันจะรวมไว้ในวงเล็บก็ตาม มีวิธีใดบ้างที่จะทำได้?
xji

2
@JIXiang สำหรับการแข่งขันที่ขี้เกียจfoo bar \n foo baz \n fooลอง/foo\_.\{-}foo
James M. Lay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.