Sublime Text regex ตรวจไม่พบแท็กหลายบรรทัด


130

ฉันมี regex อยู่ที่นี่

\[sometag\](.*)\[/sometag\]

ซึ่งควรจะจับข้อความที่ล้อมรอบด้วย[sometag]แท็ก [sometag]this is a bit of text[/sometag]การทำงานสำหรับข้อมูลบรรทัดเดียวที่มีอยู่ในแท็กเหล่านี้เช่นเดียวกับสตริง แต่ใช้ไม่ได้กับข้อความที่ครอบคลุมหลายบรรทัดเช่นนี้

[sometag] here is more text

it spans more than one line [/sometag]

ด้วยเหตุผลบางประการโปรแกรมค้นหา regex ของ Sublime text จะไม่รู้จักแท็กในหลายบรรทัด ฉันอยากรู้ว่านี่เป็นปัญหากับ Sublime Text ตัวเลือกที่สลับได้หรือแค่ความสามารถส่วนตัวของฉันกับ regexes

คำตอบ:


240

ในตอนเริ่มต้นให้ใช้ตัวปรับแต่ง dotall (?s)เพื่อสร้างจุดให้ตรงกับอักขระขึ้นบรรทัดใหม่

(?s)\[sometag\](.*?)\[\/sometag\]

การสาธิต


ขอบคุณ! ทำไมฉันต้องใส่เครื่องหมายคำถามพิเศษเหล่านั้นด้วย?
Maurdekye

8
?หลังจากนั้น*จะทำการแข่งขันแบบไม่โลภ พิจารณา[b]foo[/b]foo[b]bar[/b]เป็นตัวอย่าง \[b\].*\[\/b\]จะจับคู่ทั้งหมดตั้งแต่จุดเริ่มต้น b ถึงการปิดสุดท้าย b
Avinash Raj

เพียงแค่เล่นกับการเพิ่มและลบ?ในregex101.com/r/gI0xC3/2
Avinash Raj

11
(? s) ทำให้จุดรวมขึ้นบรรทัดใหม่ด้วย
cmroanirgo

3
เครื่องหมายคำถามหลังดอกจันมีความสำคัญเนื่องจากเป็นการกำหนดการจับคู่ว่าไม่โลภ
andrej

12

หากไม่ยอมรับการปรับเปลี่ยนโหมดของ dot ด้วยเหตุผลบางประการคุณอาจดำเนินการดังต่อไปนี้:

[sometag](.|\n)+?[/sometag]

3
อย่าใช้(.|\n)+?ถ้าคุณมีสิทธิ์เข้าถึงตัวปรับแต่ง DOTALL หากคุณไม่สามารถใช้(?s)ใน Falvor บางตัวให้ใช้[\s\S]/ [\d\D]/ [\w\W]แต่ไม่ใช่รูปแบบทางเลือกที่แนะนำที่นี่ รูปแบบนี้ไม่มีประสิทธิภาพสูงและอาจทำให้เกิดปัญหาการหมดเวลาได้อย่างง่ายดาย
Wiktor Stribiżew

1
@ WiktorStribiżew: คุณอธิบายได้ไหมว่าทำไมมันถึงไม่มีประสิทธิภาพ? ฉันมักจะใช้[\s\S]แต่ในภาพรวม(.|\n)ดูเหมือนจะเทียบเท่า? จะทำกับกลุ่มที่ตรงกันหรือไม่? แต่แล้ว(?:.|\n)จะเหมือนเดิมไหม?
Cerberus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.