Skip to content

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

空白文字\s[[:space:]]

\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

単語構成文字

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

空白文字[[:space:]]

\s-

space(syntax whitespace)

Page 49

Page 50

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

Page 51

re-builder

(Emacs標準添付)

Page 52

font-lock-studio

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