elisp มีตัวอักษร regexp หรือไม่?


14

จำนวนแบ็กสแลชจำนวนมากที่ฉันต้องการก็ค่อนข้างจะบ้า Elisp มีตัวอักษร regexp ดังนั้นฉันจึงสามารถเขียนบางอย่างเช่น

rx"some\(regexp\)"

แทน

"some\\(regexp\\)"

ไฮไลท์ Emacs สร้าง regexp บางอย่างเช่น\\|, และ\\( \\)น่าเสียดายที่ในหลาย ๆ รูปแบบสิ่งนี้ไม่สามารถมองเห็นได้ คุณสามารถลบล้างfont-lock-regexp-grouping-backslashและfont-lock-regexp-grouping-constructทำให้สิ่งนี้ชัดเจนยิ่งขึ้น
Lindydancer

2
ฉันได้ทำการแก้ไขเพื่อสนับสนุนตัวอักษรสตริงดิบ แต่ devs ไม่สนใจ
knarf

1
คุณสามารถปรับแต่งสิ่งต่าง ๆ ที่จะแสดงเช่นเดียวกับในโพสต์บล็อกนี้โดย @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@ รู้ว่ามันเป็นความอัปยศที่สเตฟานไม่สนใจในการสนับสนุนสตริงดิบเพราะสตริงดิบจะเป็นส่วนเสริมสำหรับไวยากรณ์ regexp ใหม่ (ซึ่งฉันจะชอบ) ไม่ใช่การทดแทน
nosefrog

คำตอบ:


13

ทางเลือกหนึ่งคือการใช้rxมาโครเพื่อสร้างนิพจน์ของคุณโดยใช้ sexps

ตัวอย่างของคุณกลายเป็น (rx "some" (group "regexp"))

นี่คือตัวอย่างเพิ่มเติมจากส่วนอรรถกถาใน rx.el เพื่อรับทราบวิธีการrxทำงาน:

สิ่งนี้^;;\\s-*\n\\|^\n กลายเป็น

(rx (or (and line-start ";;" (0+ space) ?\n)
        (and line-start ?\n)))

สิ่งนี้[ \t\n]*:\\([^:]+\\|$\\) กลายเป็น

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))

2
ขอบคุณสำหรับการแก้ไข @knarf! ฉันอยู่ในโทรศัพท์ของฉันและไม่ต้องการใส่ตัวอย่างที่อาจผิด :-)
glucas

เราอยู่ระหว่างการย้ายสคริปต์จำนวนมากที่ใช้การค้นหา regex จำนวนมากและแทนที่จาก perl เป็น elisp เนื่องจากrxไวยากรณ์ซึ่งทำให้ง่ายต่อการบำรุงรักษา Imho สำหรับกรณีที่คล้ายกันไวยากรณ์ของ rxด้วยตัวเองทำให้อิลิสเป็นตัวทดแทนที่คุ้มค่าสำหรับ perl python, ruby ​​และอื่น ๆ ขอบคุณ
gsl

7

ไม่มีมันไม่มีตัวอักษร regexp แต่หลายคนพบpcre2elเป็นทางเลือกที่มีประโยชน์

ใช้มันจาก elisp แบบนี้โดยเฉพาะ:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"

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