Page 1
Emacsと正規表現
Regular expressions in Emacs
Regex Festa 2019-10-18 #regexfesta
公開日:
by USAMI Kenta@tadsan
に東京都千代田区のオプトカフェ(株式会社オプト)で開催された『Regex Festa』で15分枠として発表しました。
Regular expressions in Emacs
Regex Festa 2019-10-18 #regexfesta
せっかくなのでPHPの話を先に
PHPには複数の正規表現エンジンがあります
ereg
(POSIX ERE)
preg
(PCRE)
mb_ereg
(鬼車)
PHP5系で廃止
ereg
(POSIX ERE)
preg
(PCRE)
mb_ereg
(鬼車)
現代のPHPではpreg関数(PCRE)が一般的
PHPには正規表現リテラルがない
(そもそも複数エンジンがあるのでリテラルで特権扱いされると困る)
<?php
$subject = 'a\b';preg_match('/(?<bs>\\\\)/', $subject, $m);
var_dump($m['bs']);// string(1) "\"
<?php
$subject = 'https://example.com/';// Bad pattern preg_match('/^https:\/\/([.+])/i', $subject);
preg_match('@^https://([.+])@i', $subject);preg_match('#^https://([.+])#i', $subject);
関数形式だがコンパイル結果は内部的に保持されている
PCRE関数はリクエストをまたいでコンパイル結果が保持される
PHPの話ここまで
Emacs
Emacsは正規表現でできている
1. エディタの検索機能として
2. 構文ハイライト
出典: フリー百科事典『ウィキペディア(Wikipedia)』
https://ja.wikipedia.org/wiki/正規表現
最終更新 2019年7月9日 12:45 版
出典: フリー百科事典『ウィキペディア(Wikipedia)』
https://ja.wikipedia.org/wiki/正規表現
最終更新 2019年7月9日 12:45 版
出典: フリー百科事典『ウィキペディア(Wikipedia)』
https://ja.wikipedia.org/wiki/正規表現
最終更新 2019年7月9日 12:45 版
これしか書いてない
基本正規表現とも拡張正規表現とも違う
Emacsの正規表現はNFAに分類される(最小量指定子がある)
基本拡張Emacs
グループ\(regexp\)(regexp)\(regexp\)
繰り返し\{n,m}{n,m}\{n,m}
文字クラス[abc][abc][abc]
1回以上++
選言|\|
Perl Emacs
先頭・末尾\A \z\` \'
単語構成文字
/単語境界\w \b\w \b
空白文字\s[[:space:]]
\s-
僕の知ってる正規表現と違う!
シンタックステーブル
メジャーモードごとに文字の意味を定義できる機能
言語ごとにシンボル構成文字は異なる
Lispでは foo-barは一つのシンボル(変数名や関数名になる)
Cなどの言語ではfoo-barは別シンボル(foo - bar)
その構文情報(syntax table)を正規表現から使える
逆に言うと正規表現のマッチ結果はシンタックステーブルに依存する
で、実際どうなの
文脈によってエスケープが(ように見える)変わってる
Emacsのメジャーモード(言語モード)の実装には大量の正規表現を書く必要がある
これは読みにくい
でもご安心ください
rxという正規表現組み立てDSLがある
文字列rx
グループ\(regexp\)(group "regexp")
繰り返し\{n,m}(repeat n m pattern)
文字クラス[abc](in "abc")
1回以上+(+ pattern)
選言\|(or a b)
文字列rx
先頭・末尾\` \'string-start
string-end
単語構成文字
/単語境界\w \b wordchar word-boundary
空白文字[[:space:]]
\s-
space(syntax whitespace)
ツールはいろいろ揃ってる
(Emacs標準添付)
(強調表示の色付けを順番に実行してくれる)
