ฉันจะฝึกการค้นหาและแทนที่ด้วยนิพจน์ทั่วไปแบบโต้ตอบใน Emacs ได้อย่างไร


12

การค้นหาและแทนที่ด้วยการใช้นิพจน์ทั่วไปนั้นเป็นเครื่องมือที่ทรงพลังสำหรับผู้ใช้ Emacs ที่สามารถทำการกระทำเหล่านี้ได้เป็นประจำ อย่างไรก็ตามในฐานะผู้เริ่มต้น Emacs (และ / หรือการเขียนโปรแกรม) นิพจน์ทั่วไปจำเป็นต้องเรียนรู้และฝึกฝน

ฉันสามารถเรียนรู้และฝึกอบรมนิพจน์ทั่วไปแบบโต้ตอบใน Emacs ได้เช่นเดียวกับบทช่วยสอนของ Emacs ในตัวหรือไม่ หากไม่มีคำแนะนำอื่น ๆ ในการใช้ Emacs เพื่อฝึกฝนการใช้นิพจน์ทั่วไปสำหรับการค้นหาและการแทนที่คืออะไร


1
เอกสารนี้เสร็จสมบูรณ์แล้ว: wikemacs.org/wiki/Regexp
Ehvince

คำตอบ:


17

นอกจากนี้regexp-builderคุณยังอาจพิจารณาvisual-regexpเพื่อให้ข้อเสนอแนะแก่คุณเกี่ยวกับการแทนที่ที่กำลังดำเนินการ:

visual-regexp snapshot


3
หรือแม้กระทั่งanzuซึ่งทำสิ่งเดียวกันและอื่น ๆ
sanityinc

16

คุณสามารถลองใช้M-x regexp-builder RETซึ่งเป็น matcher นิพจน์ปกติแบบโต้ตอบที่ไม่เลว


7
อย่าตกใจเมื่อC-gไม่ได้ออกอย่างที่คุณคาดหวัง C-c C-qเป็นปุ่มลัดเริ่มต้นที่จะออกจากโปรแกรมสร้าง regexp เมื่อคุณฝึกเสร็จแล้ว
nispio

5

ฉันใช้regexp-builderที่ให้คุณทดสอบ regexps แบบโต้ตอบและรับข้อเสนอแนะ และแน่นอนเมื่อฉันเริ่มใช้สิ่งนั้นฉันถามตัวเองทันทีว่า "ฉันจะป้อน regexp นี้เป็นยังquery-replace-regexpไง"

คำตอบที่ฉันเลือกเป็นฟังก์ชั่นดังต่อไปนี้ที่กำหนดไว้ในEmacsWiki Rebuilderหน้า

(defun reb-query-replace (to-string)
  "Replace current RE from point with `query-replace-regexp'."
  (interactive
   (progn (barf-if-buffer-read-only)
          (list (query-replace-read-to (reb-target-binding reb-regexp)
                                       "Query replace"  t))))
  (with-current-buffer reb-target-buffer
    (query-replace-regexp (reb-target-binding reb-regexp) to-string)))

ดังนั้นขั้นตอนการทำงานของฉันคือ:

  1. M-x re-builder
  2. ประเภทประเภทประเภท
  3. M-x reb-query-replace

3

มันสามารถช่วยได้อย่างมากเมื่อเรียนรู้ที่จะใช้ regexps เพื่อดูสิ่งที่ตรงกับส่วนของ regexp - โดยเฉพาะอย่างยิ่งกลุ่ม regexp และเพื่อทำสิ่งนั้นแบบโต้ตอบและแบบเพิ่มหน่วย

ตามคำตอบของ @ immerr การค้นหาIciclesมีการเน้นที่คล้ายกันเป็นเวลานาน

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



1

ไม่ได้อยู่ใน emacs แต่http://rubular.com/นั้นregexp-builderเป็นแบบโกง คุณสามารถตั้งค่าตัวอย่างและให้มันกระจายลิงก์ไปยังตัวอย่างนั้นได้ ฉันใช้สิ่งนี้เมื่อพูดคุยกับ regex กับทีม


1
ทับทิมใช้ Regexp ของ emacs หรือไม่?
nispio

1

อีกทางเลือกหนึ่งของ Dave F regexp-builderคุณสามารถสร้างข้อความที่กำหนดเองเพื่อฝึกจับคู่รูปแบบ

คุณลักษณะที่มีประโยชน์ที่สุดของคำสั่งนี้คือมันจะเน้นการจับคู่ในบัฟเฟอร์ในขณะที่รูปแบบถูกสร้างขึ้นเพื่อช่วยคุณในการตรวจสอบรูปแบบที่เหมาะสม

การใช้(query-replace-regexp)( C-M-%) และการสร้างนิพจน์ทั่วไปเพื่อทำการทดแทนที่คุณต้องการจะช่วยให้คุณฝึกฝนได้


ข้อเสนอนี้มีประโยชน์อะไรสำหรับผู้ที่ต้องการ "ฝึกหัด" การแสดงออกปกติที่regexp-builderไม่ได้เสนอให้? ปัญหาquery-replace-regexpคือคุณต้องเขียน regexp ทั้งหมดแล้วส่งไปให้เพื่อค้นหาว่าตรงกันหรือไม่ หากคุณไม่ชอบผลลัพธ์คุณต้องเริ่มต้นใหม่อีกครั้ง regexp-builderแสดงให้เห็นถึงการแข่งขันได้ทันทีซึ่งทำให้ง่ายต่อการปรับแต่ง regexp ของคุณจนกว่ามันจะทำงานได้ถ้าคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่
nispio

1
ฉันยอมรับว่าเป็นข้อเสียของมัน อย่างไรก็ตามหากคุณคุ้นเคยกับการแสดงออกปกติที่ใช้query-replace-regexpจะทำให้คุณคุ้นเคยกับการใช้ใน Emacs โดยเฉพาะ
Jonathan Leech-Pepin

บางที ... แต่ดูเหมือนจะไม่ตรงกับสิ่งที่ OP ขอ "หากคุณคุ้นเคยกับนิพจน์ทั่วไป" คุณไม่จำเป็นต้องเรียนรู้นิพจน์ทั่วไปเลย
nispio

1
OP ขอให้วิธีการเรียนรู้วิธี / เวลาที่จะใช้พวกเขาแบบโต้ตอบในฐานะผู้เริ่มต้น Emacs พวกเขาอาจมีความรู้เกี่ยวกับ regexp จาก regexp ประเภทอื่นอยู่แล้ว
Jonathan Leech-Pepin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.