Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Regular expressions à la carte

1,632 views

Published on

歌舞伎座.tech #9で発表した資料です。

https://y-yu.github.io/regex-slide/regex.pdf
https://y-yu.github.io/regex-slide/regex_without_animation.pdf

http://kbkz.connpass.com/event/26677/

Published in: Software
  • Be the first to comment

Regular expressions à la carte

  1. 1. 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
  2. 2. 自己紹介 次のような記事を書きました 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31
  3. 3. 自己紹介 次のような記事を書きました VM 型の正規表現エンジンを実装する http://qiita.com/yyu/items/ 84b1a00459408d1a7321 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31
  4. 4. 自己紹介 次のような記事を書きました VM 型の正規表現エンジンを実装する http://qiita.com/yyu/items/ 84b1a00459408d1a7321 正規表現から LLVM へのコンパイラを実装する http://qiita.com/yyu/items/ a0ef2d2204c137707f3f 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31
  5. 5. 自己紹介 次のような記事を書きました VM 型の正規表現エンジンを実装する http://qiita.com/yyu/items/ 84b1a00459408d1a7321 正規表現から LLVM へのコンパイラを実装する http://qiita.com/yyu/items/ a0ef2d2204c137707f3f 正規表現の JIT コンパイラを実装する http://qiita.com/yyu/items/ 3c4deb39d6b0a7955572 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 2 / 31
  6. 6. 自己紹介 次のような記事を書きました 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
  7. 7. アウトライン 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31
  8. 8. アウトライン 1 正規表現とは? 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31
  9. 9. アウトライン 1 正規表現とは? 2 マッチング 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31
  10. 10. アウトライン 1 正規表現とは? 2 マッチング 3 正規表現の限界 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31
  11. 11. アウトライン 1 正規表現とは? 2 マッチング 3 正規表現の限界 4 正規表現 vs C++ 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 3 / 31
  12. 12. 正規表現とは? 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 4 / 31
  13. 13. 正規表現とは? “ 正規表現とは、文字列の集合を一つの文字列で表現する 方法の一つである。 Wikipedia - 正規表現 ” 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 4 / 31
  14. 14. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  15. 15. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 空集合を表す φ は正規表現 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  16. 16. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 空集合を表す φ は正規表現 空文字を表す は正規表現 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  17. 17. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 空集合を表す φ は正規表現 空文字を表す は正規表現 a ∈ Σ は正規表現 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  18. 18. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 空集合を表す φ は正規表現 空文字を表す は正規表現 a ∈ Σ は正規表現 X と Y が正規表現であるとき次のものも正規表現 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  19. 19. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 空集合を表す φ は正規表現 空文字を表す は正規表現 a ∈ Σ は正規表現 X と Y が正規表現であるとき次のものも正規表現 X | Y(選択) 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  20. 20. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 空集合を表す φ は正規表現 空文字を表す は正規表現 a ∈ Σ は正規表現 X と Y が正規表現であるとき次のものも正規表現 X | Y(選択) XY(結合) 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  21. 21. 正規表現の定義 文字の集合 Σ 上の正規表現は次のように定義される 空集合を表す φ は正規表現 空文字を表す は正規表現 a ∈ Σ は正規表現 X と Y が正規表現であるとき次のものも正規表現 X | Y(選択) XY(結合) X∗(0 回以上の繰り返し) 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 5 / 31
  22. 22. マッチング 主に次のような方法がある 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31
  23. 23. マッチング 主に次のような方法がある 有限オートマトンを用いた方法 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31
  24. 24. マッチング 主に次のような方法がある 有限オートマトンを用いた方法 Virtual Machine を用いた方法 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31
  25. 25. マッチング 主に次のような方法がある 有限オートマトンを用いた方法 Virtual Machine を用いた方法 正規表現の微分を用いた方法 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 6 / 31
  26. 26. 非決定性有限オートマトン(NFA) “ 非決定性有限オートマトンは、有限オートマトンの一種 であり、ある状態と入力があったとき、次の遷移先が一 意に決定しないことがあるものである。 Wikipedia - 非決定性有限オートマトン ” 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 7 / 31
  27. 27. 非決定性有限オートマトン(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
  28. 28. NFAを用いたマッチング 全ての正規表現には対応する非決定性有限オートマトンが存 在する 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 8 / 31
  29. 29. 正規表現とNFA 文字 N(a) qstart f a 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 9 / 31
  30. 30. 正規表現とNFA 文字 N(a) qstart f a 選択 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
  31. 31. 正規表現とNFA 結合 N(st) N(s) N(t) qstart f 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 10 / 31
  32. 32. 正規表現と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
  33. 33. NFAを用いたマッチング 全ての正規表現には対応する非決定性有限オートマトンが存 在する 遷移先が一意に決まらないので、バックトラックをする必要 がある 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 11 / 31
  34. 34. 決定性有限オートマトン(DFA) “ 決定性有限オートマトンは、状態と入力によって次に遷 移すべき状態が一意に定まる有限オートマトンである。 Wikipedia - 決定性有限オートマトン ” 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 12 / 31
  35. 35. 決定性有限オートマトン(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
  36. 36. DFAを用いたマッチング 非決定性有限オートマトンから機械的に変換できる(サブ セット構成など) 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31
  37. 37. DFAを用いたマッチング 非決定性有限オートマトンから機械的に変換できる(サブ セット構成など) 入力によって状態が一意に決まるので、バックトラックをす る必要がない 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31
  38. 38. DFAを用いたマッチング 非決定性有限オートマトンから機械的に変換できる(サブ セット構成など) 入力によって状態が一意に決まるので、バックトラックをす る必要がない 非決定有限オートマトンから変換すると、最悪の場合、状態 数が指数関数的に増加する 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31
  39. 39. DFAを用いたマッチング 非決定性有限オートマトンから機械的に変換できる(サブ セット構成など) 入力によって状態が一意に決まるので、バックトラックをす る必要がない 非決定有限オートマトンから変換すると、最悪の場合、状態 数が指数関数的に増加する そのため、必要になった状態だけ変換するというテクニック がある 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 13 / 31
  40. 40. Virtual Machine(VM)を使ったマッチング 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31
  41. 41. Virtual Machine(VM)を使ったマッチング 次のような VM を用いて正規表現のマッチングが可能 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31
  42. 42. Virtual Machine(VM)を使ったマッチング 次のような VM を用いて正規表現のマッチングが可能 PC と SP という 2 つのレジスタがある 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31
  43. 43. Virtual Machine(VM)を使ったマッチング 次のような VM を用いて正規表現のマッチングが可能 PC と SP という 2 つのレジスタがある 次の命令がある 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31
  44. 44. Virtual Machine(VM)を使ったマッチング 次のような VM を用いて正規表現のマッチングが可能 PC と SP という 2 つのレジスタがある 次の命令がある char c SP の先頭の文字と c を比較 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31
  45. 45. Virtual Machine(VM)を使ったマッチング 次のような VM を用いて正規表現のマッチングが可能 PC と SP という 2 つのレジスタがある 次の命令がある char c SP の先頭の文字と c を比較 match マッチに成功(スレッドを終了) 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31
  46. 46. Virtual Machine(VM)を使ったマッチング 次のような VM を用いて正規表現のマッチングが可能 PC と SP という 2 つのレジスタがある 次の命令がある char c SP の先頭の文字と c を比較 match マッチに成功(スレッドを終了) jmp x アドレス x へジャンプ(PC を x にする) 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 14 / 31
  47. 47. 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
  48. 48. Virtual Machine(VM)を用いたマッチング 正規表現を次のように変換する 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31
  49. 49. Virtual Machine(VM)を用いたマッチング 正規表現を次のように変換する 文字(c) char c 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31
  50. 50. Virtual Machine(VM)を用いたマッチング 正規表現を次のように変換する 文字(c) char c 連結(e1e2) e1 の命令列 e2 の命令列 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31
  51. 51. Virtual Machine(VM)を用いたマッチング 正規表現を次のように変換する 文字(c) char c 選択(e1 | e2) split L1 L2 L1 : e1 の命令列 jmp L3 L2 : e2 の命令列 L3 : 連結(e1e2) e1 の命令列 e2 の命令列 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31
  52. 52. 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 L3 L2 : e2 の命令列 jmp L1 L3 : 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 15 / 31
  53. 53. 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 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 16 / 31
  54. 54. 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
  55. 55. 正規表現の微分を用いたマッチング ∗この文字列 c : wc は文字 c が文字列の先頭の 1 文字で、cw は文字列の先頭 以外の残りを表す 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 17 / 31
  56. 56. 正規表現の微分を用いたマッチング 正規表現の微分 c : wc という文字列があるとする ∗。ある正規表現 r が文字列 c : wc にマッチするならば、r を文字 c で微分した正規表現 rc は文 字列 wc にマッチする。 ∗この文字列 c : wc は文字 c が文字列の先頭の 1 文字で、cw は文字列の先頭 以外の残りを表す 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 17 / 31
  57. 57. 正規表現の微分を用いたマッチング 正規表現の微分 c : wc という文字列があるとする ∗。ある正規表現 r が文字列 c : wc にマッチするならば、r を文字 c で微分した正規表現 rc は文 字列 wc にマッチする。 1 マッチング対象の文字列から 1 文字ずつ取り出し、正規表現 を微分していく ∗この文字列 c : wc は文字 c が文字列の先頭の 1 文字で、cw は文字列の先頭 以外の残りを表す 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 17 / 31
  58. 58. 正規表現の微分を用いたマッチング 正規表現の微分 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
  59. 59. 正規表現の限界 /^1?$|^(11+)1+$/ 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 18 / 31
  60. 60. 正規表現の限界 1 が非素数個ある文字列の正規表現 /^1?$|^(11+)1+$/ 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 19 / 31
  61. 61. 正規表現の限界 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
  62. 62. 正規表現と非正規表現 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31
  63. 63. 正規表現と非正規表現 ポンピング補題などを使うと、正規表現で表せる集合かどう か証明できる 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31
  64. 64. 正規表現と非正規表現 ポンピング補題などを使うと、正規表現で表せる集合かどう か証明できる たとえば、次のものは正規である ある正規表現の補集合を表す正規表現 先読み 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31
  65. 65. 正規表現と非正規表現 ポンピング補題などを使うと、正規表現で表せる集合かどう か証明できる たとえば、次のものは正規である ある正規表現の補集合を表す正規表現 先読み たとえば、次のものは非正規である 後方参照 再帰 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31
  66. 66. 正規表現と非正規表現 ポンピング補題などを使うと、正規表現で表せる集合かどう か証明できる たとえば、次のものは正規である ある正規表現の補集合を表す正規表現 先読み たとえば、次のものは非正規である 後方参照 再帰 非素数にマッチする正規表現は後方参照を用いていたので、 非正規表現である 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31
  67. 67. 正規表現と非正規表現 ポンピング補題などを使うと、正規表現で表せる集合かどう か証明できる たとえば、次のものは正規である ある正規表現の補集合を表す正規表現 先読み たとえば、次のものは非正規である 後方参照 再帰 非素数にマッチする正規表現は後方参照を用いていたので、 非正規表現である 非正規になると、正規表現が持つよい性質が失われる 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 20 / 31
  68. 68. 正規表現 vs C++† †この内容はほとんどが新屋さんの成果です 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 21 / 31
  69. 69. wを表示するプログラム w を表示するプログラム “ main(){__builtin_puts("w");} C++で 40 バイトの Hello World を書いた ” 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 22 / 31
  70. 70. wを表示するプログラム w を表示するプログラム “ main(){__builtin_puts("w");} C++で 40 バイトの Hello World を書いた ”w を表示する C++のプログラム 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 22 / 31
  71. 71. 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
  72. 72. Grass Grass “ Grass is a functional grass-planting programming language. Grass the grass-planting programming language ” 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31
  73. 73. Grass Grass “ Grass is a functional grass-planting programming language. Grass the grass-planting programming language ”C++と同じくチューリング完全なプログラム言語 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31
  74. 74. Grass Grass “ Grass is a functional grass-planting programming language. Grass the grass-planting programming language ”C++と同じくチューリング完全なプログラム言語 w と W と v の組み合せでプログラムが記述できる 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31
  75. 75. 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∗ 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 23 / 31
  76. 76. 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
  77. 77. wを表示するプログラム w を表示するプログラム wwWwvWWwwwwvwvwvWwvwWwwvvvvvv 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31
  78. 78. wを表示するプログラム w を表示するプログラム wwWwvWWwwwwvwvwvWwvwWwwvvvvvv Grass で w を表示するプログラム 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31
  79. 79. wを表示するプログラム w を表示するプログラム wwWwvWWwwwwvwvwvWwvwWwwvvvvvv Grass で w を表示するプログラム このプログラムは 29 Byte 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31
  80. 80. wを表示するプログラム w を表示するプログラム wwWwvWWwwwwvwvwvWwvwWwwvvvvvv Grass で w を表示するプログラム このプログラムは 29 Byte C++より 1 Byte 大きい 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 24 / 31
  81. 81. RANS RANS “ RANS’s concept is very simple, just calculates the number from the given string on a regular language. http://sinya8282.github.io/RANS/ ” 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 25 / 31
  82. 82. RANS RANS “ RANS’s concept is very simple, just calculates the number from the given string on a regular language. http://sinya8282.github.io/RANS/ ”ある文字列が、ある正規表現が表す集合の何番目に位置する のか計算するプログラム 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 25 / 31
  83. 83. RANS RANS “ RANS’s concept is very simple, just calculates the number from the given string on a regular language. http://sinya8282.github.io/RANS/ ”ある文字列が、ある正規表現が表す集合の何番目に位置する のか計算するプログラム 文字列から番号、番号から文字列、どちらも変換できる 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 25 / 31
  84. 84. RANS RANS “ RANS’s concept is very simple, just calculates the number from 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
  85. 85. wを表示するプログラム w を表示するプログラムは 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31
  86. 86. wを表示するプログラム w を表示するプログラムは 469787137681 番目の Grass プログラム 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31
  87. 87. wを表示するプログラム w を表示するプログラムは 469787137681 番目の Grass プログラム この数字はテキストで 12 Byte 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31
  88. 88. wを表示するプログラム w を表示するプログラムは 469787137681 番目の Grass プログラム この数字はテキストで 12 Byte C++と比べて 16 Byte 小さい 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31
  89. 89. wを表示するプログラム w を表示するプログラムは 469787137681 番目の Grass プログラム この数字はテキストで 12 Byte C++と比べて 16 Byte 小さい C++に勝利した 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 26 / 31
  90. 90. 1 自己紹介 2 正規表現とは? 3 マッチング NFA を用いたマッチング DFA を用いたマッチング VM を用いたマッチング 正規表現の微分を用いたマッチング 4 正規表現の限界 正規表現と非正規表現 5 正規表現 vs C++ C++ Grass RANS 6 おすすめの文献 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 27 / 31
  91. 91. おすすめの文献 新屋良磨, 鈴木勇介, 高田謙. 正規表現技術入門 — 最新エンジン実装と理論的背景 (WEB+DB PRESS plus). 技術評論社, 4 2015. 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 28 / 31
  92. 92. Thank you for listening! 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 29 / 31
  93. 93. ポンピング補題 L が正規言語 ‡ であるならば、次が成り立つ。 ‡正規表現で表現できる言語であるという意味 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 30 / 31
  94. 94. ポンピング補題 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
  95. 95. ポンピング補題 非素数言語を Lnp = {1α·β | α > 1, β > 1} として、 w = 11 11 11 ∈ Lnp, l = 1 とする 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 31 / 31
  96. 96. ポンピング補題 非素数言語を 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 ∈ Lnp となり、ポンピング補題を満さない 吉村 優 (https://twitter.com/_yyu_) Regular expressions à la carte March 20, 2016 31 / 31

×