เหตุใดนิพจน์ทั่วไปที่สร้างด้วยตัวสร้าง regex ใช้ไวยากรณ์ต่างจากนิพจน์ทั่วไปเชิงโต้ตอบ


26

ดังนั้นการใช้เครื่องมือสร้างนิพจน์ทั่วไป (Mx re-builder) การค้นหาบรรทัดที่ลงท้ายด้วย \ take "\\ $" ในขณะที่ค้นหาและแทนที่ด้วย regex จะใช้เวลาเพียง "\ $" ฉันคาดว่าผู้สร้าง regex จะสร้างนิพจน์ที่ใช้งานได้โดยตรงดังนั้นสิ่งที่บัญชีสำหรับความแตกต่างนี้


6
มันสร้างการแสดงออกที่ใช้งานได้โดยตรงในรหัส
abo-abo

1
@ abo-abo นั่นคือคำตอบที่ฉันกำลังมองหาฉันไม่ได้ตระหนักว่ามีความแตกต่างระหว่างสิ่งที่ใช้งานได้ในรหัสและสิ่งที่ใช้งานได้ใน UI ดูเหมือนว่าเคาน์เตอร์เป็นเรื่องง่ายที่ผู้สร้างขึ้นใหม่จะใช้ไวยากรณ์รหัสและคู่มือไม่ได้พูด แต่อธิบายความแตกต่าง
2699

2
เพื่อให้ตัวสร้าง regex มีประโยชน์มากขึ้นสำหรับการสร้างการค้นหาแบบโต้ตอบให้ดูที่หน้า ReBuilder emacs wikiโดยเฉพาะreb-query-replaceคำจำกัดความของฟังก์ชัน
dfeich

คำตอบ:


29

จริงๆแล้วมีสี่ที่แตกต่างกัน re-builderตัวเลือกไวยากรณ์ที่ตัวและคุณสามารถสลับระหว่างกันได้C-cTAB

สองอย่างคือคอมไพเลอร์ regexp ของ sexp-form rxและsregex(แต่เนื่องจากในอดีตนั้นมีความครอบคลุมมากกว่าและสามารถใช้กับไวยากรณ์ได้เกือบทั้งหมดคุณสามารถละเว้น sregex ได้เว้นแต่คุณจะใช้รหัสเก่าที่ใช้)

อีกสองตัวเลือกไวยากรณ์คือread(ค่าเริ่มต้น) และstring(ซึ่งเป็นไวยากรณ์ที่คุณใช้แบบโต้ตอบ)

readไวยากรณ์คือ 'รหัส' ไวยากรณ์ - คือเป็นที่ยอมรับโดยผู้อ่านกระเพื่อม - การที่คุณป้อน regexp ตามความไวยากรณ์การอ่านสำหรับสตริง :

C-hig (elisp) Syntax for Strings RET

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

หากคุณต้องการใช้ไวยากรณ์สตริงโดยค่าเริ่มต้นให้เพิ่มสิ่งต่อไปนี้ในไฟล์ init ของคุณหรือใช้ M-x customize-option RET reb-re-syntax RET

(setq reb-re-syntax 'string)

โปรดทราบว่าคุณสามารถสลับไปมาระหว่างการอ่านและไวยากรณ์สตริงเมื่อแก้ไข regexp โดยไม่สูญเสียข้อมูล คุณยังสามารถเปลี่ยนจากรูปแบบ sexp เป็น read / string syntax (โดยปกติแล้วการคอมไพล์ sexps เป็นสตริงนั้นเป็นสิ่งที่ไลบรารี่เหล่านั้นใช้) แต่คุณไม่สามารถไปในทิศทางอื่นและสร้าง sexp จากสตริง ผู้สร้างซ้ำจะจดจำว่า sexp นั้นคืออะไรดังนั้นคุณจะไม่เสียรูปแบบนั้นเมื่อคุณเปลี่ยนไวยากรณ์ แต่ยังไม่ได้รับการปรับปรุงหากคุณแก้ไข regexp ในรูปแบบที่แตกต่างกันแล้วเปลี่ยนกลับ กล่าวโดยย่อหากคุณกำลังสร้าง regexp เป็น sexp ตรวจสอบให้แน่ใจว่าคุณแก้ไขได้เฉพาะในขณะที่ใช้ไวยากรณ์นั้น


gotcha พร้อมการrxรองรับคือการใช้งานrx-to-stringฟังก์ชั่นซึ่งไม่เหมือนกับการใช้rxมาโครในโค้ด rxยอมรับจำนวนข้อโต้แย้งของรูปแบบโดยพลการและถือว่าเป็นลำดับโดยนัยในขณะที่rx-to-stringยอมรับเพียงรูปแบบเดียวและลำดับระดับบนสุดใด ๆ จะต้องชัดเจน'(sequence ...)หรือเทียบเท่า

ในระยะสั้นเมื่อคุณป้อนแบบฟอร์ม'(...)ในการสร้างใหม่มันจะถูกประมวลผลเป็น(rx-to-string '(...))และไม่(rx ...)

นอกจากนี้โปรดทราบว่ารูปแบบที่ไม่ถูกต้องอาจทำให้re-builderหยุดการปรับปรุงการแข่งขันในบัฟเฟอร์ที่เกี่ยวข้องแบบไดนามิกแม้ว่าจะทำให้ฟอร์มถูกต้องอีกครั้ง การC-cC-uเชื่อมโยงสำหรับreb-force-updateมีประโยชน์สำหรับการแก้ไขสถานการณ์เหล่านี้


โดยค่าเริ่มต้นบรรทัดโหมดจะแสดง "ตัวสร้าง RE" เมื่อใช้readหรือstringไวยากรณ์และ "RE Builder Lisp" เมื่อใช้rxหรือsregexไวยากรณ์ แต่ดูเหมือนว่ามีประโยชน์มากกว่าที่จะระบุเฉพาะไวยากรณ์ใช้งานอยู่ (โดยเฉพาะเพื่อแยกความแตกต่างระหว่างreadและstring)

หากคุณติดตั้งdelightแพคเกจจาก GNU ELPA คุณสามารถใช้รายการต่อไปนี้เพื่อเพิ่มตัวบ่งชี้ไวยากรณ์ในบรรทัดโหมด

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

สิ่งนี้จะเปลี่ยนชื่อโหมดเป็น "Regexp [read]" ใน readรูปแบบไวยากรณ์และในทำนองเดียวกันสำหรับคนอื่น ๆ

หรือหากต้องการรวมคำใบ้สำหรับrxvs rx-to-stringgotcha ที่อธิบายไว้ข้างต้นให้บรรทัดโหมดพูดว่า "Regexp [rx-to-string]" เมื่อใช้rxไวยากรณ์:

(let ((name '("Regexp["
              (:eval (symbol-name (if (eq reb-re-syntax 'rx)
                                      'rx-to-string
                                    reb-re-syntax)))
              "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.