ฉันสามารถทำได้: s ทำงานเฉพาะในนัดสุดท้ายของสายหรือไม่


16

:s/pattern/replacementดำเนินการในนัดแรกและ:s/pattern/replacement/gทุกนัด

วิธีการใช้งานเฉพาะในล่าสุด?

คำตอบ:


18

ฉันจะใช้ \zs

:%s/.*\zspattern/replacement/

คำอธิบายเล็กน้อย:

  • . แสดงถึงอักขระเดี่ยวใด ๆ
  • * แสดงถึงการจับคู่โลภ (มากที่สุดเท่าที่เป็นไปได้)

ในกลุ่มคุณสามารถใช้จุดยึดความกว้างเป็นศูนย์\zsและ\zeเพื่อกำหนดจุดเริ่มต้นและจุดสิ้นสุดของรูปแบบการค้นหาที่คุณต้องการจับคู่ สิ่งใดก่อน\zsและหลัง\zeในรูปแบบของคุณจะไม่ได้รับผลกระทบจากการแทนที่

เพื่อให้ง่ายต่อการเข้าใจฉันต้องการใช้ตัวอย่างนี้จากการค้นหาของwikia และแทนที่ :

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

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

ใช้:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

สำหรับข้อมูลเพิ่มเติมดูที่


คุณช่วยอธิบายรายละเอียดพื้นฐานของ\zsคำตอบของคุณได้ไหม?
EvergreenTree

3
มันเป็นมูลค่า noting ว่าเหตุผลนี้ทำงานเป็นเพราะ.*เป็นโลภ
Wildcard

7

คุณสามารถค้นหาสำหรับการแข่งขันที่ผ่านมาโดยการจัดกลุ่มทั้งหมด\(.*\)แต่ ocurrence patternสุดท้ายของ จากนั้นออกจากกับกลุ่มที่จับและเพิ่ม\1replacement

:%s/\(.*\)pattern/\1replacement/

(วิธีนี้จะด้อยกว่า\zsวิธีการแก้ปัญหาของ @ ryuichiro ซึ่ง\1วิธีการของคุณเทียบเท่ากับ verbose แต่มากกว่า verbose (ในทางกลับกันมันอาจจะจำได้ง่ายกว่าสำหรับบางคนโดยเฉพาะถ้าพวกเขาคุ้นเคยกับรสชาติของ regex อื่น ๆ ))
Aaron Thoma

0

เพื่อความสมบูรณ์ฉันคิดว่าฉันโพสต์ทางเลือก เป็นกลุ่มมีรายการหลายบางแห่งที่มีความคล้ายคลึงกับมาตรฐานมากขึ้นปกติแสดงออกยืนยัน LookAround (ลบ / lookahead บวก / lookbehind) /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

ในกรณีนี้เราต้องการ lookahead ลบ\@!ความหมายที่เราต้องการที่จะยืนยันว่าอะตอมที่นำหน้ารายการที่ไม่ได้เกิดขึ้นหลังจากที่รูปแบบ ในกรณีนี้อะตอมเป็นรูปแบบนำหน้าด้วยสิ่งอื่น:

:%s/pattern\(.*pattern\)\@!/replacement/

ส่วนภายในวงเล็บคือความกว้างเป็นศูนย์และไม่รวมอยู่ในการแข่งขันดังนั้นจะไม่ถูกแทนที่ด้วยการทดแทน

:h \@!สำหรับข้อมูลเพิ่มเติมหรือ:h pattern-multi-itemsสำหรับส่วนทั้งหมดที่มีรูปแบบการค้นหาอื่น ๆ

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