pcre2el 20161120.1303(in MELPA)
regexp syntax converter

概要

Emacsの正規表現は呪いです。

なんだあのバックスラッシュの連発は…

Emacs大好きでもあの 正規表現 だけは許せないという人は
僕も含め、それなりの数がいると思われます。

そんなあなたにとっておきのパッケージを紹介します。

pcre2el.el は、以下の機能をもって呪わしき正規表現から救ってくれます。

  • Emacsの正規表現から PCRE へ変換
  • Emacsの正規表現から rx (S式による表現)へ変換
  • 正規表現を分解して文字列リスト化
  • カーソル位置・regionの正規表現をrx形式に変換して解説!
  • M-x re-builder でPCREに対応!!

これはそもそもelispで書かれたPCREエミュレータであり、
Emacsの正規表現に変換できる範囲でPCREが使えます。

そもそもEmacsの正規表現とPCREは一対一対応ではないので、
完全にPCREの機能が使えるわけではないですが、
よっぽど混み入った機能を使わないのであれば実用上問題ありません。

外部プログラムを使ってないのでWindowsでも安心です。

この超大作elispは本当に素晴しいです。

ただ、名前で思い切り損しています。

この名前だとEmacsでPCREが使えるだけだと誤解されてしまうので、
正規表現変換・解説機能、re-builder対応については
ファイルを分割して別々のMELPAパッケージにすべきだと思います。

複雑な正規表現を分解して解説してくれる機能と
re-builderでPCREが使えるのは圧巻です!!!!

elispプログラマ以外でも正規表現に悩めるすべての人に
使ってもらいたいパッケージです。

そして、elispプログラマならば
複雑な正規表現は極力 rx で書いてください!

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてpcre2elを使う方は
以下のコマンドを実行します。

M-x package-install pcre2el

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name pcre2el

正規表現変換・解説

M-x rxt-mode でRegular eXpression Translationマイナーモードを
有効にすると、以下のコマンドが使えます。

C-c / /
rxt-explain 正規表現を解説
C-c / c
rxt-convert-syntax Emacs/PCRE間の変換し、kill-ringへ
C-c / x
rxt-convert-to-rx rxへの変換
C-c / ′
rxt-convert-to-strings 文字列集合へ分解

これらのコマンドは空気を読んでくれます。

emacs-lisp-mode か lisp-interaction-mode では
Emacsの正規表現を前提にし、その他のモードではPCREを前提にします。

正規表現は以下のようにして読み込まれます。

  • C-u付きで呼び出したらミニバッファから正規表現を入力
  • カーソル位置が正規表現の末尾・中身ならその正規表現
  • regionが有効ならばその部分の正規表現
  • どれでもなければミニバッファから正規表現を入力

それでは正規表現を解説してみましょう。

C-c / / を押すと別ウィンドウに正規表現をrx形式で
pretty-printされて表示されます。

しかもカーソルを移動すると該当部分をハイライトしてくれる優れ物!

elispを読んでいて理解不能な正規表現が現れたら
ぜひとも使ってみてください。

20150425034737.png
Fig1: C-c / / で正規表現を分解!

20150425034748.png
Fig2: カーソルを動かすと該当部分をハイライト

20150425034813.png
Fig3: こんな感じ

20150425035002.png
Fig4: C-c / cでPCREに変換されkill-ringへ

C-c / ' で文字列集合に分解したら、
そのまま regexp-opt として記述できます。

(regexp-opt '("foo" "bar" "baz"))

20150425035107.png
Fig5: C-c / ' で文字列集合へ

C-c / tでカーソル位置の正規表現をrx形式にしてくれるので、
より理解しやすいコードになります。

20150425035115.png
Fig6: C-c / tでrx形式に変更

M-x re-builderでPCRE!

M-x re-builderでPCREが使えるようになります。

ということは、PCREやそれに似た正規表現を持つ他言語で
プログラミングしているときにも使えることを意味します。

PerlやPHPはもろにPCREに対応していますし、
Rubyの鬼車はPCREを拡張したものになっています。

本設定では reb-re-syntax を設定し、
re-builderのデフォルトの文法をpcreにしていますが、
C-c C-iで文法を切り替えられます。

20150425040117.png
Fig7: PCREでre-bulder!!

pcre2elを使っているパッケージ

visual-regexp-steroids.el(レビュー) はPCRE/Pythonの正規表現で
置換結果を見ながらの置換・isearchを行います。

helm-swoop.el(大々的レビュー) の元となった swoop.el でも
M-x swoop-pcre-regexp でPCREによる絞り込みができます。

swoop.elはhelm-swoop.elと同じ作者なので、
helm-swoop-pcre-regexpが欲しいものです。

設定 150425034446.pcre2el.el(以下のコードと同一)

(require 'pcre2el)
(add-hook 'prog-mode-hook 'rxt-mode)
(setq reb-re-syntax 'pcre)

実行方法

$ wget http://rubikitch.com/f/150425034446.pcre2el.el
$ emacs -Q -f package-initialize -l 150425034446.pcre2el.el

本サイト内の関連パッケージ


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。