การสนับสนุนสำหรับ regex มองไปข้างหน้าและข้างหน้า?


12

ฉันต้องทำการแทนที่แบบสอบถาม regex เช่นนั้น

fooในfoo barคือจับคู่ แต่fooในfoo bazไม่ ปกติผมจะใช้ข้างหน้าดู regex foo(?=bar)เช่น

อย่างไรก็ตามดูเหมือนว่า Emacs จะทำเช่นนี้ไม่ได้? ดูเหมือนว่าจะมีความสามารถแต่โหมดชั่วร้ายใน spacemacs ไม่สามารถทำได้


นอกจากนี้ยังมีสิ่งนี้: github.com/gamesun/emacs-regex-lookaroundแต่ฉันไม่ได้ลองสร้างด้วย patch นี้และดูเหมือนว่ามันจะใช้เวลานาน
wvxvw

คำตอบ:


10

ไม่นิพจน์ทั่วไปของ Emacs ไม่สนับสนุนการยืนยันล่วงหน้าที่มีความกว้างเป็นศูนย์

nb Evil and Spacemacs (เช่นไลบราลีทั้งหมด) ไม่เกี่ยวข้องเมื่อถามถึงการใช้ภาษา Emacs Lisp


ดังนั้นจึงเป็นไปไม่ได้ที่จะมาแทนที่fooในfoobarแต่ไม่ได้อยู่ในfoobaz? นี่เป็นการดำเนินการทั่วไปที่ฉันคิดว่าต้องมีวิธีแก้ปัญหา อาจมองไปข้างหน้าและข้างหลังเป็นวิธีการที่ผิดหรือเปล่า?
ไฮเซนเบิร์ก

สิ่งนี้ไม่เทียบเท่าอย่างเคร่งครัด แต่การแทนที่foo\(bar\)ด้วยbaz\1จะเพียงพอในทุกกรณีที่barไม่มีการแข่งขันเพิ่มเติม
phils

หากคุณเขียน elisp คุณจะมีความยืดหยุ่นมากมายและหากคุณเปลี่ยนแบบโต้ตอบคุณสามารถเรียกใช้ elisp โดยพลการในระหว่างการแทนที่ดังนั้นในที่สุดก็มีวิธีที่จะทำสิ่งเหล่านี้ ไม่สะดวกอย่างที่คุณอาจทำกับการยืนยันเหล่านั้น
phils

เช่นการแทนที่fooด้วย\,(if (looking-at "bar") "baz" \&)จะแทนที่fooด้วยbazหากข้อความต่อไปนี้เป็นbar(และแทนที่fooด้วยfooอย่างอื่น) ซึ่งยังคงไม่เหมือนกับการจับคู่ เฉพาะfooเมื่อมีการติดตามbarแต่เป็นตัวเลือกอื่น
phils

ฉันเดาว่านี่เป็นสิ่งที่คุณพูดไว้ข้างต้น แต่ดูเหมือนว่าคุณสามารถพิมพ์: CSM-% foo \ (bar \) RET FOO \ 1 RET เพื่อแทนที่ foo bar ทั้งหมดด้วย FOO bar แต่ปล่อย foo baz ทั้งหมดเพียงอย่างเดียว นี่เป็นบางสิ่งที่คุณต้องการหรือไม่?
John Kitchin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.