Emacsと正規表現

公開日:

東京都千代田区オプトカフェ(株式会社オプト)で開催された『Regex Festa』で15分枠として発表しました。

Download PDF

スライドテキスト

Page 1

Emacsと正規表現

Regular expressions in Emacs

Regex Festa

2019-10-18 #regexfesta

Page 2

お前誰よ
うさみけんた (@tadsan)

/ Zonu.EXE

  • GitHub/Packagistでは id: zonuexe
    • ピクシブ株式会社 pixiv事業本部
  • Emacs Lisper, PHPer
  • Emacs PHP Modeのメンテナ引き継ぎました
    • 好きなリスプはEmacs Lispです
    • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

Page 4

Page 5

せっかくなので PHPの話を先に

Page 6

PHPには複数の
正規表現エンジンが
あります

Page 7

ereg (POSIX ERE)
preg (PCRE) mb_ereg (鬼車)

Page 8

PHP5系で廃止

ereg (POSIX ERE)
preg (PCRE) mb_ereg (鬼車)

Page 9

現代のPHPでは
preg関数(PCRE)
が一般的

Page 10

PHPには正規表現
リテラルがない

Page 11

(そもそも複数エンジン があるのでリテラルで 特権扱いされると困る)

Page 12

バックスラッシュのエスケープ

<?php

$subject = 'a\b';
preg_match('/(?<bs>\\\\)/', $subject, $m);

var_dump($m['bs']);
// string(1) "\"

Page 13

デリミタの変更

<?php

$subject = 'https://example.com/';
// Bad pattern
preg_match('/^https:\/\/([.+])/i', $subject);

preg_match('@^https://([.+])@i', $subject); preg_match('#^https://([.+])#i', $subject);

Page 14

関数形式だがコンパ イル結果は内部的に
保持されている

Page 15

PCRE関数はリクエ
ストをまたいでコンパ イル結果が保持される

Page 16

PHPの話ここまで

Page 17

Emacs

Page 18

Emacsは正規表現
でできている

Page 19

1. エディタの 検索機能として

Page 20

2. 構文ハイライト

Page 21

出典: フリー百科事典『ウィキペディア(Wikipedia)』
https://ja.wikipedia.org/wiki/正規表現
最終更新 2019年7月9日 12:45 版

Page 22

出典: フリー百科事典『ウィキペディア(Wikipedia)』
https://ja.wikipedia.org/wiki/正規表現
最終更新 2019年7月9日 12:45 版

Page 23

出典: フリー百科事典『ウィキペディア(Wikipedia)』
https://ja.wikipedia.org/wiki/正規表現
最終更新 2019年7月9日 12:45 版

Page 24

これしか書いてない

Page 25

基本正規表現とも 拡張正規表現とも
違う

Page 26

Emacsの正規表現は
NFAに分類される (最小量指定子がある)

Page 27

基本 拡張 Emacs

グループ \(regexp\) (regexp) \(regexp\)

繰り返し \{n,m} {n,m} \{n,m}

文字クラス [abc] [abc] [abc]

1回以上 + +

選言 | \|

Page 28

Perl Emacs

先頭・末尾 \A \z \` \'

単語構成文字

\w \b \w \b

/単語境界

[[:space:]]

空白文字 \s

\s-

Page 29

僕の知ってる
正規表現と違う!

Page 30

シンタックス
テーブル

Page 31

メジャーモードごと
に文字の意味を 定義できる機能

Page 32

言語ごとにシンボル
構成文字は異なる

Page 33

Lispでは foo-bar は一つのシンボル (変数名や関数名になる)

Page 34

Cなどの言語では
foo-barは別シンボル

(foo - bar)

Page 35

その構文情報

(syntax table)
正規表現から使える

Page 36

逆に言うと正規表現の
マッチ結果はシンタック
ステーブルに依存する

Page 37

Page 38

で、実際どうなの

Page 39

文脈によって エスケープが

変わってる

(ように見える)

Page 40

Page 41

Page 42

Emacsのメジャー
モード(言語モード)の 実装には大量の正規表
現を書く必要がある

Page 43

Page 44

これは読みにくい

Page 45

でもご安心ください

Page 46

rxという正規表現
組み立てDSLがある

Page 47

文字列 rx

グループ \(regexp\) (group "regexp")

繰り返し \{n,m} (repeat n m pattern)

文字クラス [abc] (in "abc")

1回以上 + (+ pattern)

選言 \| (or a b)

Page 48

文字列 rx

string-start

先頭・末尾 \` \'

string-end

単語構成文字 wordchar

\w \b
/単語境界 word-boundary

[[:space:]] space

空白文字

\s- (syntax whitespace)

Page 49

Page 50

ツールはいろいろ
揃ってる

Page 51

re-builder
(Emacs標準添付)

Page 52

font-lock-studio (強調表示の色付けを順番
に実行してくれる)