วิธีการทำให้ regex matchers ไม่โลภ?


20

ฉันพยายามใช้ regex เพื่อแทนที่ข้อความในไฟล์ (แทนที่ URL แบบเต็มด้วยโปรโตคอล / โดเมน /):

:%s/\(https\?:\/\/.*?\/\).*/\1/gc

น่าเสียดายที่.*?ไม่ตรงกับสตริงแม้จะพยายามหลีกเลี่ยง?ปริมาณ ปริมาณที่ไม่โลภควรหนีในกลุ่มได้อย่างไร?


2
:help greedyจะพาคุณไปยังหัวข้อความช่วยเหลือที่ถูกต้อง :help regexpคือความช่วยเหลือในการอธิบายรสชาติ regex ของ Vim
jamessan

คำตอบ:


27

Regex ของ Vim มีไวยากรณ์พิเศษสำหรับตัวดำเนินการเวอร์ชันที่ไม่โลภมาก (มันน่ารำคาญ แต่คุณต้องจดจำพวกเขา): http://vimregex.com/#Non-Greedy

รุ่นไม่โลภของมี* \{-}ดังนั้นแทนที่.*ด้วย.\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc

6

ฉันชอบแบ่งปัญหาออกเป็นสองขั้นตอนเสมอ:

/\v(https?):\/\/(.{-})\/.*        <-- Search
:%s,,Protocol:\1 - Domain:\2,g    <-- Substitution

ใช้เวทย์มนตร์ "\ v" เพื่อหลีกเลี่ยงแบ็กสแลชจำนวนมากโดยอ้างอิงการค้นหาล่าสุดในการทดแทนและการเปลี่ยนตัวคั่นการแทนที่ การเปลี่ยนแปลงทั้งหมดนี้ทำให้โค้ดอ่านง่ายขึ้น

ป้อนคำอธิบายรูปภาพที่นี่


2

คุณยังสามารถใช้[^\]+/.เพื่อป้องกันความโลภ [^/]หมายถึง "จับคู่สิ่งที่คาดหวัง/และ+ทำซ้ำอย่างน้อยหนึ่งครั้ง ..

:%s!\v^(https?)\://([^/]+)/.*$!Protocol:\1 \t Domain:\2!g

ถ้าผมมี/ใน regex ที่ฉันจะใช้เป็นตัวคั่นเพื่อที่ฉันจะได้ไม่ต้องหลบหนี!/

ตัวอย่าง

สมมติว่าคุณมี URL ต่อไปนี้:

http://academy.mises.org/courses/econgd/
http://academy.mises.org/moodle/course/view.php?id=172
http://acmsel.safaribooksonline.com/book/-/9781449358204?bookview=overview
http://acmsel.safaribooksonline.com/home
http://acordes.lacuerda.net/bebo__cigala/lagrimas_negras-2.shtml
http://acordes.lacuerda.net/jose_antonio_labordeta/albada.shtml
http://anarchitext.wordpress.com/category/new-middle-east/
https://courses.edx.org/courses/course-v1%3ADelftX%2BFP101x%2B3T2015/wiki/DelftX.FP101x.3T2015/resources-and-links/
https://cseweb.ucsd.edu/classes/wi11/cse230/lectures.html
https://developer.mozilla.org/en-US/docs/CSS
https://developers.google.com/edu/python
https://developers.google.com/structured-data/testing-tool/

ใช้การทดแทนคุณจะได้รับ:

Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:anarchitext.wordpress.com
Protocol:https   Domain:courses.edx.org
Protocol:https   Domain:cseweb.ucsd.edu
Protocol:https   Domain:developer.mozilla.org
Protocol:https   Domain:developers.google.com
Protocol:https   Domain:developers.google.com
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.