Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Regular expressions à la carte

1.635 visualizaciones

Publicado el

歌舞伎座.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/

Publicado en: Software
  • Sé el primero en comentar

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

×