elispには正規表現リテラルがありますか?


14

私の正規表現が必要とするバックスラッシュの数は非常に多いです。elispには正規表現リテラルがあるので、次のように書くことができます

rx"some\(regexp\)"

の代わりに

"some\\(regexp\\)"

Emacsはのようないくつかの正規表現構文を強調表示し\\|\\(、と\\)。残念ながら、多くのテーマではこれは見えません。これをオーバーライドfont-lock-regexp-grouping-backslashfont-lock-regexp-grouping-constructて、これをより明確にすることができます。
リンディダンサー

2
生の文字列リテラルをサポートするパッチを作成しましたが、開発者は興味がありません。
knarf

1
@ abo-aboによる次のブログ投稿のように、いつでも表示を調整できます:oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@knarfは、未加工の文字列が新しい正規表現構文(私が支持する)の補完ではなく、置換ではないため、Stefanが未加工の文字列サポートに興味を持たなかったことは残念です。
鼻カエル

回答:


13

1つのオプションは、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

実際、多くの正規表現検索を使用し、perlからelispに置換する多くのスクリプトを、rx構文が保守しやすいように移動する過程にあります。私見、同様の場合、rx構文はそれ自体でelispをperl python、rubyなどに代わる価値のあるものにします。ありがとうございます。
gsl

7

いいえ、正規表現リテラルはありませんが、多くはpcre2elが有用な代替手段であると考えています。

具体的には、次のようにelispから使用します。

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

それでも、バックスラッシュを2倍にする必要があります。平均的な正規表現にはそれほど多くは必要ありません。
cjm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.