regular expressions à la carte

96
Regular expressions à la carte kbkz.tech #9 吉村 優 https://twitter.com/_yyu_ http://qiita.com/yyu https://github.com/y-yu March 20, 2016 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 1 / 31

Upload: -

Post on 16-Apr-2017

1.379 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Regular expressions à la carte

Regular expressions à la cartekbkz.tech #9

吉村優

https://twitter.com/_yyu_http://qiita.com/yyu

https://github.com/y-yu

March 20, 2016

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 1 / 31

Page 2: Regular expressions à la carte

自己紹介

次のような記事を書きました

VM型の正規表現エンジンを実装するhttp://qiita.com/yyu/items/84b1a00459408d1a7321

正規表現から LLVMへのコンパイラを実装するhttp://qiita.com/yyu/items/a0ef2d2204c137707f3f

正規表現の JITコンパイラを実装するhttp://qiita.com/yyu/items/3c4deb39d6b0a7955572

正規表現の微分でサブマッチングhttp://qiita.com/yyu/items/1638fd59bedce27ca3a4

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31

Page 3: Regular expressions à la carte

自己紹介

次のような記事を書きましたVM型の正規表現エンジンを実装する

http://qiita.com/yyu/items/84b1a00459408d1a7321

正規表現から LLVMへのコンパイラを実装するhttp://qiita.com/yyu/items/a0ef2d2204c137707f3f

正規表現の JITコンパイラを実装するhttp://qiita.com/yyu/items/3c4deb39d6b0a7955572

正規表現の微分でサブマッチングhttp://qiita.com/yyu/items/1638fd59bedce27ca3a4

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31

Page 4: Regular expressions à la carte

自己紹介

次のような記事を書きましたVM型の正規表現エンジンを実装する

http://qiita.com/yyu/items/84b1a00459408d1a7321

正規表現から LLVMへのコンパイラを実装するhttp://qiita.com/yyu/items/a0ef2d2204c137707f3f

正規表現の JITコンパイラを実装するhttp://qiita.com/yyu/items/3c4deb39d6b0a7955572

正規表現の微分でサブマッチングhttp://qiita.com/yyu/items/1638fd59bedce27ca3a4

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31

Page 5: Regular expressions à la carte

自己紹介

次のような記事を書きましたVM型の正規表現エンジンを実装する

http://qiita.com/yyu/items/84b1a00459408d1a7321

正規表現から LLVMへのコンパイラを実装するhttp://qiita.com/yyu/items/a0ef2d2204c137707f3f

正規表現の JITコンパイラを実装するhttp://qiita.com/yyu/items/3c4deb39d6b0a7955572

正規表現の微分でサブマッチングhttp://qiita.com/yyu/items/1638fd59bedce27ca3a4

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31

Page 6: Regular expressions à la carte

自己紹介

次のような記事を書きましたVM型の正規表現エンジンを実装する

http://qiita.com/yyu/items/84b1a00459408d1a7321

正規表現から LLVMへのコンパイラを実装するhttp://qiita.com/yyu/items/a0ef2d2204c137707f3f

正規表現の JITコンパイラを実装するhttp://qiita.com/yyu/items/3c4deb39d6b0a7955572

正規表現の微分でサブマッチングhttp://qiita.com/yyu/items/1638fd59bedce27ca3a4

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31

Page 7: Regular expressions à la carte

アウトライン

1 正規表現とは?2 マッチング3 正規表現の限界4 正規表現 vs C++

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31

Page 8: Regular expressions à la carte

アウトライン

1 正規表現とは?

2 マッチング3 正規表現の限界4 正規表現 vs C++

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31

Page 9: Regular expressions à la carte

アウトライン

1 正規表現とは?2 マッチング

3 正規表現の限界4 正規表現 vs C++

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31

Page 10: Regular expressions à la carte

アウトライン

1 正規表現とは?2 マッチング3 正規表現の限界

4 正規表現 vs C++

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31

Page 11: Regular expressions à la carte

アウトライン

1 正規表現とは?2 マッチング3 正規表現の限界4 正規表現 vs C++

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31

Page 12: Regular expressions à la carte

正規表現とは?

“ 正規表現とは、文字列の集合を一つの文字列で表現する方法の一つである。

Wikipedia -正規表現”

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 4 / 31

Page 13: Regular expressions à la carte

正規表現とは?

“ 正規表現とは、文字列の集合を一つの文字列で表現する方法の一つである。

Wikipedia -正規表現”

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 4 / 31

Page 14: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現空文字を表す εは正規表現a ∈ Σは正規表現Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)I XY(結合)I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 15: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現

空文字を表す εは正規表現a ∈ Σは正規表現Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)I XY(結合)I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 16: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現空文字を表す εは正規表現

a ∈ Σは正規表現Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)I XY(結合)I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 17: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現空文字を表す εは正規表現a ∈ Σは正規表現

Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)I XY(結合)I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 18: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現空文字を表す εは正規表現a ∈ Σは正規表現Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)I XY(結合)I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 19: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現空文字を表す εは正規表現a ∈ Σは正規表現Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)

I XY(結合)I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 20: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現空文字を表す εは正規表現a ∈ Σは正規表現Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)I XY(結合)

I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 21: Regular expressions à la carte

正規表現の定義

文字の集合 Σ上の正規表現は次のように定義される

空集合を表す φは正規表現空文字を表す εは正規表現a ∈ Σは正規表現Xと Yが正規表現であるとき次のものも正規表現

I X | Y(選択)I XY(結合)I X∗(0回以上の繰り返し)

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31

Page 22: Regular expressions à la carte

マッチング

主に次のような方法がある

有限オートマトンを用いた方法Virtual Machineを用いた方法正規表現の微分を用いた方法

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31

Page 23: Regular expressions à la carte

マッチング

主に次のような方法がある有限オートマトンを用いた方法

Virtual Machineを用いた方法正規表現の微分を用いた方法

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31

Page 24: Regular expressions à la carte

マッチング

主に次のような方法がある有限オートマトンを用いた方法Virtual Machineを用いた方法

正規表現の微分を用いた方法

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31

Page 25: Regular expressions à la carte

マッチング

主に次のような方法がある有限オートマトンを用いた方法Virtual Machineを用いた方法正規表現の微分を用いた方法

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31

Page 26: Regular expressions à la carte

非決定性有限オートマトン(NFA)

“ 非決定性有限オートマトンは、有限オートマトンの一種であり、ある状態と入力があったとき、次の遷移先が一意に決定しないことがあるものである。

Wikipedia -非決定性有限オートマトン”

qastart

qb

qc

w

w

v,w

W

w

W

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 7 / 31

Page 27: Regular expressions à la carte

非決定性有限オートマトン(NFA)

“ 非決定性有限オートマトンは、有限オートマトンの一種であり、ある状態と入力があったとき、次の遷移先が一意に決定しないことがあるものである。

Wikipedia -非決定性有限オートマトン”

qastart

qb

qc

w

w

v,w

W

w

W

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 7 / 31

Page 28: Regular expressions à la carte

NFAを用いたマッチング

全ての正規表現には対応する非決定性有限オートマトンが存在する

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 8 / 31

Page 29: Regular expressions à la carte

正規表現とNFA

文字N(a)

qstart fa

選択N(s | t)

N(s)

N(t)

qstart

qs

qt

fs

ft

f

ε

ε

ε

ε

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 9 / 31

Page 30: Regular expressions à la carte

正規表現とNFA

文字N(a)

qstart fa

選択N(s | t)

N(s)

N(t)

qstart

qs

qt

fs

ft

f

ε

ε

ε

ε

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 9 / 31

Page 31: Regular expressions à la carte

正規表現とNFA

結合N(st)

N(s) N(t)qstart f

繰り返しN(s∗)

N(s)

qstart

qs fs

f

ε

ε

ε

ε

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 10 / 31

Page 32: Regular expressions à la carte

正規表現とNFA

結合N(st)

N(s) N(t)qstart f

繰り返しN(s∗)

N(s)

qstart

qs fs

f

ε

ε

ε

ε

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 10 / 31

Page 33: Regular expressions à la carte

NFAを用いたマッチング

全ての正規表現には対応する非決定性有限オートマトンが存在する遷移先が一意に決まらないので、バックトラックをする必要がある

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 11 / 31

Page 34: Regular expressions à la carte

決定性有限オートマトン(DFA)

“ 決定性有限オートマトンは、状態と入力によって次に遷移すべき状態が一意に定まる有限オートマトンである。

Wikipedia -決定性有限オートマトン”

qastart qb qc

qd

w

v,W

v,w

W

w

W

v

v,w,W

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 12 / 31

Page 35: Regular expressions à la carte

決定性有限オートマトン(DFA)

“ 決定性有限オートマトンは、状態と入力によって次に遷移すべき状態が一意に定まる有限オートマトンである。

Wikipedia -決定性有限オートマトン”qastart qb qc

qd

w

v,W

v,w

W

w

W

v

v,w,W

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 12 / 31

Page 36: Regular expressions à la carte

DFAを用いたマッチング

非決定性有限オートマトンから機械的に変換できる(サブセット構成など)

入力によって状態が一意に決まるので、バックトラックをする必要がない非決定有限オートマトンから変換すると、最悪の場合、状態数が指数関数的に増加するそのため、必要になった状態だけ変換するというテクニックがある

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31

Page 37: Regular expressions à la carte

DFAを用いたマッチング

非決定性有限オートマトンから機械的に変換できる(サブセット構成など)入力によって状態が一意に決まるので、バックトラックをする必要がない

非決定有限オートマトンから変換すると、最悪の場合、状態数が指数関数的に増加するそのため、必要になった状態だけ変換するというテクニックがある

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31

Page 38: Regular expressions à la carte

DFAを用いたマッチング

非決定性有限オートマトンから機械的に変換できる(サブセット構成など)入力によって状態が一意に決まるので、バックトラックをする必要がない非決定有限オートマトンから変換すると、最悪の場合、状態数が指数関数的に増加する

そのため、必要になった状態だけ変換するというテクニックがある

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31

Page 39: Regular expressions à la carte

DFAを用いたマッチング

非決定性有限オートマトンから機械的に変換できる(サブセット構成など)入力によって状態が一意に決まるので、バックトラックをする必要がない非決定有限オートマトンから変換すると、最悪の場合、状態数が指数関数的に増加するそのため、必要になった状態だけ変換するというテクニックがある

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31

Page 40: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能PCと SPという 2つのレジスタがある次の命令がある

char cSPの先頭の文字と cを比較

matchマッチに成功(スレッドを終了)

jmp xアドレス xへジャンプ(PCを xにする)

split x, yスレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 41: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能

PCと SPという 2つのレジスタがある次の命令がある

char cSPの先頭の文字と cを比較

matchマッチに成功(スレッドを終了)

jmp xアドレス xへジャンプ(PCを xにする)

split x, yスレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 42: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能PCと SPという 2つのレジスタがある

次の命令がある

char cSPの先頭の文字と cを比較

matchマッチに成功(スレッドを終了)

jmp xアドレス xへジャンプ(PCを xにする)

split x, yスレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 43: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能PCと SPという 2つのレジスタがある次の命令がある

char cSPの先頭の文字と cを比較

matchマッチに成功(スレッドを終了)

jmp xアドレス xへジャンプ(PCを xにする)

split x, yスレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 44: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能PCと SPという 2つのレジスタがある次の命令があるchar c

SPの先頭の文字と cを比較

matchマッチに成功(スレッドを終了)

jmp xアドレス xへジャンプ(PCを xにする)

split x, yスレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 45: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能PCと SPという 2つのレジスタがある次の命令があるchar c

SPの先頭の文字と cを比較match

マッチに成功(スレッドを終了)

jmp xアドレス xへジャンプ(PCを xにする)

split x, yスレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 46: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能PCと SPという 2つのレジスタがある次の命令があるchar c

SPの先頭の文字と cを比較match

マッチに成功(スレッドを終了)jmp x

アドレス xへジャンプ(PCを xにする)

split x, yスレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 47: Regular expressions à la carte

Virtual Machine(VM)を使ったマッチング

次のようなVMを用いて正規表現のマッチングが可能PCと SPという 2つのレジスタがある次の命令があるchar c

SPの先頭の文字と cを比較match

マッチに成功(スレッドを終了)jmp x

アドレス xへジャンプ(PCを xにする)split x, y

スレッドを二つに分割する。片方は PCを xにし、もう片方は PCを yにする

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31

Page 48: Regular expressions à la carte

Virtual Machine(VM)を用いたマッチング

正規表現を次のように変換する

文字(c)char c

選択(e1 | e2)split L1 L2

L1 : e1の命令列jmp L3

L2 : e2の命令列L3 :

連結(e1e2)e1の命令列e2の命令列

繰り返し(e∗)L1 : split L1 L3L2 : e2の命令列

jmp L1L3 :

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31

Page 49: Regular expressions à la carte

Virtual Machine(VM)を用いたマッチング

正規表現を次のように変換する

文字(c)char c

選択(e1 | e2)split L1 L2

L1 : e1の命令列jmp L3

L2 : e2の命令列L3 :

連結(e1e2)e1の命令列e2の命令列

繰り返し(e∗)L1 : split L1 L3L2 : e2の命令列

jmp L1L3 :

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31

Page 50: Regular expressions à la carte

Virtual Machine(VM)を用いたマッチング

正規表現を次のように変換する

文字(c)char c

選択(e1 | e2)split L1 L2

L1 : e1の命令列jmp L3

L2 : e2の命令列L3 :

連結(e1e2)e1の命令列e2の命令列

繰り返し(e∗)L1 : split L1 L3L2 : e2の命令列

jmp L1L3 :

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31

Page 51: Regular expressions à la carte

Virtual Machine(VM)を用いたマッチング

正規表現を次のように変換する

文字(c)char c

選択(e1 | e2)split L1 L2

L1 : e1の命令列jmp L3

L2 : e2の命令列L3 :

連結(e1e2)e1の命令列e2の命令列

繰り返し(e∗)L1 : split L1 L3L2 : e2の命令列

jmp L1L3 :

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31

Page 52: Regular expressions à la carte

Virtual Machine(VM)を用いたマッチング

正規表現を次のように変換する

文字(c)char c

選択(e1 | e2)split L1 L2

L1 : e1の命令列jmp L3

L2 : e2の命令列L3 :

連結(e1e2)e1の命令列e2の命令列

繰り返し(e∗)L1 : split L1 L3L2 : e2の命令列

jmp L1L3 :

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31

Page 53: Regular expressions à la carte

Virtual Machine(VM)を用いたマッチング

正規表現/aa*bb*/をVMのバイトコードへ変換する

0 char a

1 split 2, 4

2 char a

3 jmp 1

4 char b

5 split 6, 8

6 char b

7 jmp 5

8 match

VMの命令を LLVMや JVMに変換すれば、より高速になる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 16 / 31

Page 54: Regular expressions à la carte

Virtual Machine(VM)を用いたマッチング

正規表現/aa*bb*/をVMのバイトコードへ変換する

0 char a

1 split 2, 4

2 char a

3 jmp 1

4 char b

5 split 6, 8

6 char b

7 jmp 5

8 match

VMの命令を LLVMや JVMに変換すれば、より高速になる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 16 / 31

Page 55: Regular expressions à la carte

正規表現の微分を用いたマッチング

正規表現の微分c : wcという文字列があるとする ∗。ある正規表現 rが文字列c : wcにマッチするならば、rを文字 cで微分した正規表現 rcは文字列wcにマッチする。

1 マッチング対象の文字列から 1文字ずつ取り出し、正規表現を微分していく

2 文字列が空になった時に、微分された正規表現が空文字を受理するならばマッチングに成功

∗この文字列 c : wcは文字 cが文字列の先頭の 1文字で、cwは文字列の先頭以外の残りを表す吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 17 / 31

Page 56: Regular expressions à la carte

正規表現の微分を用いたマッチング

正規表現の微分c : wcという文字列があるとする ∗。ある正規表現 rが文字列c : wcにマッチするならば、rを文字 cで微分した正規表現 rcは文字列wcにマッチする。

1 マッチング対象の文字列から 1文字ずつ取り出し、正規表現を微分していく

2 文字列が空になった時に、微分された正規表現が空文字を受理するならばマッチングに成功

∗この文字列 c : wcは文字 cが文字列の先頭の 1文字で、cwは文字列の先頭以外の残りを表す吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 17 / 31

Page 57: Regular expressions à la carte

正規表現の微分を用いたマッチング

正規表現の微分c : wcという文字列があるとする ∗。ある正規表現 rが文字列c : wcにマッチするならば、rを文字 cで微分した正規表現 rcは文字列wcにマッチする。

1 マッチング対象の文字列から 1文字ずつ取り出し、正規表現を微分していく

2 文字列が空になった時に、微分された正規表現が空文字を受理するならばマッチングに成功

∗この文字列 c : wcは文字 cが文字列の先頭の 1文字で、cwは文字列の先頭以外の残りを表す吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 17 / 31

Page 58: Regular expressions à la carte

正規表現の微分を用いたマッチング

正規表現の微分c : wcという文字列があるとする ∗。ある正規表現 rが文字列c : wcにマッチするならば、rを文字 cで微分した正規表現 rcは文字列wcにマッチする。

1 マッチング対象の文字列から 1文字ずつ取り出し、正規表現を微分していく

2 文字列が空になった時に、微分された正規表現が空文字を受理するならばマッチングに成功

∗この文字列 c : wcは文字 cが文字列の先頭の 1文字で、cwは文字列の先頭以外の残りを表す吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 17 / 31

Page 59: Regular expressions à la carte

正規表現の限界

/^1?$|^(11+)\1+$/

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 18 / 31

Page 60: Regular expressions à la carte

正規表現の限界

1が非素数個ある文字列の正規表現/^1?$|^(11+)\1+$/

例次のような文字列がマッチする

1︸︷︷︸1?11︸︷︷︸11+?

11︸︷︷︸\1

111︸︷︷︸11+?

111︸︷︷︸\1

111︸︷︷︸\1

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 19 / 31

Page 61: Regular expressions à la carte

正規表現の限界

1が非素数個ある文字列の正規表現/^1?$|^(11+)\1+$/

例次のような文字列がマッチする

1︸︷︷︸1?11︸︷︷︸11+?

11︸︷︷︸\1

111︸︷︷︸11+?

111︸︷︷︸\1

111︸︷︷︸\1

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 19 / 31

Page 62: Regular expressions à la carte

正規表現と非正規表現

ポンピング補題などを使うと、正規表現で表せる集合かどうか証明できるたとえば、次のものは正規である

I ある正規表現の補集合を表す正規表現I 先読み

たとえば、次のものは非正規であるI 後方参照I 再帰

非素数にマッチする正規表現は後方参照を用いていたので、非正規表現である非正規になると、正規表現が持つよい性質が失われる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31

Page 63: Regular expressions à la carte

正規表現と非正規表現

ポンピング補題などを使うと、正規表現で表せる集合かどうか証明できる

たとえば、次のものは正規であるI ある正規表現の補集合を表す正規表現I 先読み

たとえば、次のものは非正規であるI 後方参照I 再帰

非素数にマッチする正規表現は後方参照を用いていたので、非正規表現である非正規になると、正規表現が持つよい性質が失われる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31

Page 64: Regular expressions à la carte

正規表現と非正規表現

ポンピング補題などを使うと、正規表現で表せる集合かどうか証明できるたとえば、次のものは正規である

I ある正規表現の補集合を表す正規表現I 先読み

たとえば、次のものは非正規であるI 後方参照I 再帰

非素数にマッチする正規表現は後方参照を用いていたので、非正規表現である非正規になると、正規表現が持つよい性質が失われる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31

Page 65: Regular expressions à la carte

正規表現と非正規表現

ポンピング補題などを使うと、正規表現で表せる集合かどうか証明できるたとえば、次のものは正規である

I ある正規表現の補集合を表す正規表現I 先読み

たとえば、次のものは非正規であるI 後方参照I 再帰

非素数にマッチする正規表現は後方参照を用いていたので、非正規表現である非正規になると、正規表現が持つよい性質が失われる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31

Page 66: Regular expressions à la carte

正規表現と非正規表現

ポンピング補題などを使うと、正規表現で表せる集合かどうか証明できるたとえば、次のものは正規である

I ある正規表現の補集合を表す正規表現I 先読み

たとえば、次のものは非正規であるI 後方参照I 再帰

非素数にマッチする正規表現は後方参照を用いていたので、非正規表現である

非正規になると、正規表現が持つよい性質が失われる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31

Page 67: Regular expressions à la carte

正規表現と非正規表現

ポンピング補題などを使うと、正規表現で表せる集合かどうか証明できるたとえば、次のものは正規である

I ある正規表現の補集合を表す正規表現I 先読み

たとえば、次のものは非正規であるI 後方参照I 再帰

非素数にマッチする正規表現は後方参照を用いていたので、非正規表現である非正規になると、正規表現が持つよい性質が失われる

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31

Page 68: Regular expressions à la carte

正規表現 vs C++†

†この内容はほとんどが新屋さんの成果です吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 21 / 31

Page 69: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラム

“ main(){__builtin_puts("w");}

C++で 40 バイトの Hello World を書いた”

wを表示するC++のプログラム全体で 28 Byte

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 22 / 31

Page 70: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラム

“ main(){__builtin_puts("w");}

C++で 40 バイトの Hello World を書いた”wを表示するC++のプログラム

全体で 28 Byte

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 22 / 31

Page 71: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラム

“ main(){__builtin_puts("w");}

C++で 40 バイトの Hello World を書いた”wを表示するC++のプログラム全体で 28 Byte

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 22 / 31

Page 72: Regular expressions à la carte

Grass

Grass

“ Grass is a functional grass-planting programming language.Grass the grass-planting programming language”

C++と同じくチューリング完全なプログラム言語wと Wと vの組み合せでプログラムが記述できる文法が次のように定義される

app ::= W+ w+

abs ::= w+ app∗

prog ::= abs | prog v abs | prog v app∗

文法を正規表現で表せるw((w|v)*(W+w)*)*

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31

Page 73: Regular expressions à la carte

Grass

Grass

“ Grass is a functional grass-planting programming language.Grass the grass-planting programming language”

C++と同じくチューリング完全なプログラム言語

wと Wと vの組み合せでプログラムが記述できる文法が次のように定義される

app ::= W+ w+

abs ::= w+ app∗

prog ::= abs | prog v abs | prog v app∗

文法を正規表現で表せるw((w|v)*(W+w)*)*

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31

Page 74: Regular expressions à la carte

Grass

Grass

“ Grass is a functional grass-planting programming language.Grass the grass-planting programming language”

C++と同じくチューリング完全なプログラム言語wと Wと vの組み合せでプログラムが記述できる

文法が次のように定義される

app ::= W+ w+

abs ::= w+ app∗

prog ::= abs | prog v abs | prog v app∗

文法を正規表現で表せるw((w|v)*(W+w)*)*

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31

Page 75: Regular expressions à la carte

Grass

Grass

“ Grass is a functional grass-planting programming language.Grass the grass-planting programming language”

C++と同じくチューリング完全なプログラム言語wと Wと vの組み合せでプログラムが記述できる文法が次のように定義される

app ::= W+ w+

abs ::= w+ app∗

prog ::= abs | prog v abs | prog v app∗

文法を正規表現で表せるw((w|v)*(W+w)*)*

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31

Page 76: Regular expressions à la carte

Grass

Grass

“ Grass is a functional grass-planting programming language.Grass the grass-planting programming language”

C++と同じくチューリング完全なプログラム言語wと Wと vの組み合せでプログラムが記述できる文法が次のように定義される

app ::= W+ w+

abs ::= w+ app∗

prog ::= abs | prog v abs | prog v app∗

文法を正規表現で表せるw((w|v)*(W+w)*)*

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31

Page 77: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムwwWwvWWwwwwvwvwvWwvwWwwvvvvvv

Grassで wを表示するプログラムこのプログラムは 29 Byte

C++より 1 Byte大きい

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31

Page 78: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムwwWwvWWwwwwvwvwvWwvwWwwvvvvvv

Grassで wを表示するプログラム

このプログラムは 29 Byte

C++より 1 Byte大きい

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31

Page 79: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムwwWwvWWwwwwvwvwvWwvwWwwvvvvvv

Grassで wを表示するプログラムこのプログラムは 29 Byte

C++より 1 Byte大きい

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31

Page 80: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムwwWwvWWwwwwvwvwvWwvwWwwvvvvvv

Grassで wを表示するプログラムこのプログラムは 29 Byte

C++より 1 Byte大きい

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31

Page 81: Regular expressions à la carte

RANS

RANS

“ RANS’s concept is very simple, just calculates the numberfrom the given string on a regular language.

http://sinya8282.github.io/RANS/”

ある文字列が、ある正規表現が表す集合の何番目に位置するのか計算するプログラム文字列から番号、番号から文字列、どちらも変換できる番号に変換すれば、C++並に短くなるはず

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 25 / 31

Page 82: Regular expressions à la carte

RANS

RANS

“ RANS’s concept is very simple, just calculates the numberfrom the given string on a regular language.

http://sinya8282.github.io/RANS/”ある文字列が、ある正規表現が表す集合の何番目に位置するのか計算するプログラム

文字列から番号、番号から文字列、どちらも変換できる番号に変換すれば、C++並に短くなるはず

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 25 / 31

Page 83: Regular expressions à la carte

RANS

RANS

“ RANS’s concept is very simple, just calculates the numberfrom the given string on a regular language.

http://sinya8282.github.io/RANS/”ある文字列が、ある正規表現が表す集合の何番目に位置するのか計算するプログラム文字列から番号、番号から文字列、どちらも変換できる

番号に変換すれば、C++並に短くなるはず

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 25 / 31

Page 84: Regular expressions à la carte

RANS

RANS

“ RANS’s concept is very simple, just calculates the numberfrom the given string on a regular language.

http://sinya8282.github.io/RANS/”ある文字列が、ある正規表現が表す集合の何番目に位置するのか計算するプログラム文字列から番号、番号から文字列、どちらも変換できる番号に変換すれば、C++並に短くなるはず

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 25 / 31

Page 85: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムは

469787137681

番目のGrassプログラム

この数字はテキストで 12 Byte

C++と比べて 16 Byte小さいC++に勝利した

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31

Page 86: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムは

469787137681

番目のGrassプログラム

この数字はテキストで 12 Byte

C++と比べて 16 Byte小さいC++に勝利した

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31

Page 87: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムは

469787137681

番目のGrassプログラム

この数字はテキストで 12 Byte

C++と比べて 16 Byte小さいC++に勝利した

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31

Page 88: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムは

469787137681

番目のGrassプログラム

この数字はテキストで 12 Byte

C++と比べて 16 Byte小さい

C++に勝利した

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31

Page 89: Regular expressions à la carte

wを表示するプログラム

wを表示するプログラムは

469787137681

番目のGrassプログラム

この数字はテキストで 12 Byte

C++と比べて 16 Byte小さいC++に勝利した

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31

Page 90: Regular expressions à la carte

1 自己紹介2 正規表現とは?3 マッチング

NFAを用いたマッチングDFAを用いたマッチングVMを用いたマッチング正規表現の微分を用いたマッチング

4 正規表現の限界正規表現と非正規表現

5 正規表現 vs C++C++GrassRANS

6 おすすめの文献

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 27 / 31

Page 91: Regular expressions à la carte

おすすめの文献

新屋良磨,鈴木勇介,高田謙.正規表現技術入門—最新エンジン実装と理論的背景(WEB+DB PRESS plus).技術評論社, 4 2015.

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 28 / 31

Page 92: Regular expressions à la carte

Thank you for listening!

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 29 / 31

Page 93: Regular expressions à la carte

ポンピング補題

Lが正規言語 ‡であるならば、次が成り立つ。

任意の正規言語 Lについて、言語 Lについてのみ依存する反復長l > 0が存在し、|w| ≥ lとなる全てのw ∈ Lについて次が成り立つ

1 |y| > 0かつ |xy| ≤ lとなる 2 を満すwの分割w = xyzが存在する

2 すべての i ≥ 0について xyiz ∈ Lが成り立つ

‡正規表現で表現できる言語であるという意味吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 30 / 31

Page 94: Regular expressions à la carte

ポンピング補題

Lが正規言語 ‡であるならば、次が成り立つ。

任意の正規言語 Lについて、言語 Lについてのみ依存する反復長l > 0が存在し、|w| ≥ lとなる全てのw ∈ Lについて次が成り立つ

1 |y| > 0かつ |xy| ≤ lとなる 2 を満すwの分割w = xyzが存在する

2 すべての i ≥ 0について xyiz ∈ Lが成り立つ

‡正規表現で表現できる言語であるという意味吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 30 / 31

Page 95: Regular expressions à la carte

ポンピング補題

非素数言語を Lnp = {1α·β | α > 1, β > 1}として、w = 11 11 11 ∈ Lnp, l = 1とする

反例l = 1かつ |y| > 0, |xy| ≤ l = 1より、|x| = 0, |y| = 1となる。従ってw = ︸︷︷︸

x

1︸︷︷︸y

11111︸ ︷︷ ︸z

とすると、

|xy2z| = |xyz|+ |y| = 6+ 1 = 7となり、7は素数であることから、xy2z 6∈ Lnpとなり、ポンピング補題を満さない

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 31 / 31

Page 96: Regular expressions à la carte

ポンピング補題

非素数言語を Lnp = {1α·β | α > 1, β > 1}として、w = 11 11 11 ∈ Lnp, l = 1とする

反例l = 1かつ |y| > 0, |xy| ≤ l = 1より、|x| = 0, |y| = 1となる。従ってw = ︸︷︷︸

x

1︸︷︷︸y

11111︸ ︷︷ ︸z

とすると、

|xy2z| = |xyz|+ |y| = 6+ 1 = 7となり、7は素数であることから、xy2z 6∈ Lnpとなり、ポンピング補題を満さない

吉村優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 31 / 31