中級正規表現
大林一平
KMC/Dept. Math., Kyoto U./JST CREST

2013/08/17,24

Kobe Rubyist Meetup 1st
+α

大林一平 (KMC/Dept. Math., Kyoto U...
自己紹介
大林一平 (ohai)
理学研究科数学教室
▶
▶
▶

特定研究員
力学系
最近は歩行の数理モデルの相空間のグローバルな力学
系構造の解析

Ruby
▶
▶

るりま (http://doc.ruby-lang.org)
Ruby...
題目

正規表現
NFA
絶対最大量指定子とアトミックグループ
先読み,後読み,アンカー
名前付きキャプチャ
参考資料

大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

2013/08/1...
正規表現
文字列を判別するためのプログラミング言語
▶
▶

元は数学的な「言語」理論のために発明された
DSL

高度な制御機構
▶
▶

高い抽象性
後で説明する「バックトラック」

短く書ける構文
低い抽象化能力
▶

変数,関数,に相当...
NFA
Non determistic Finite Automaton
大半の正規表現エンジンで使われている仕組み
▶
▶

Perl
PCRE(Perl Compatible Regular Expression)
⋆

▶

⋆
▶

P...
NFA の利点と欠点
DFA と比べて以下の利点がある.
後方参照 1, . . . が使える
先読みなどができる
さらなる拡張が可能
▶
▶

条件分岐
部分式呼び出し

Finite Automaton の数理的能力を越える
欠点は性能上 ...
バックトラック
NFA の動作の基本原理
再帰呼び出しのようなもの
▶

深さ優先探索

2 つの選択子がある場合,一方を保留しつつもう
一方のマッチを試す
▶

例えば /a+b/ で “a” にマッチした場合,
⋆
⋆

もう一文字 a の...
/[abc]*b/.match("abbca")

大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

2013/08/17,24

8 / 21
/[abc]*b/.match("abbca")

大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

2013/08/17,24

9 / 21
/[abc]*b/.match("abbca")

* は greedy なので,[abc] の繰り返しマッチを優先する

大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

2013/08/...
/[abc]*?b/.match("abbca")

*? は reluctant なので,b のマッチを優先する

大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

2013/08/17,...
最小量指定子の活用例

ダブルクオートで囲まれたテキストを取り出す.

/"(.*?)"/
普通の量指定子を使うと 3 つ以上のダブルクオートが
文字列に含まれていると問題になる.

大林一平 (KMC/Dept. Math., Kyoto U...
正規表現の性能

tree 構造によって性能は劇的に異なる.
特にマッチが失敗する場合はチェ
ックする場合の
数が膨大になる可能性がある
大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

2...
特に量指定子がネストしていると場合の数の爆発が起
きやすい

/X(.+)+X/

大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

2013/08/17,24

14 / 21
バックトラックの抑制
高機能な NFA エンジンには,バックトラックを抑制す
る仕組みを持つものがある.
絶対最大量指定子 (possessive quantifier)
▶

繰り返し内でのバックトラックを一切しない

アトミックグループ
▶
...
/[abc]*+b/.match("abbca")

水色の○の手前まで戻る (つまり失敗する)
マッチが失敗しやすくなる
▶

失敗したほうが都合が良い場合に使えなくもない

性能の向上に使える
▶

特にマッチ失敗時の性能に良く効く

大林...
例
メールヘッダの取り出し

/A[^:]+:/
/A[^:]++:/
絶対最大量指定子を使うと,メールヘッダ「でない」
場合には失敗するまでの計算時間が短くなる

大林一平 (KMC/Dept. Math., Kyoto U./JST CRE...
名前付きキャプチャ
キャプチャや後方参照は通常 1, 2, . . . , という名前
が付けられる
識別子で名前を付けることができる
(?<name>pat) でキャプチャし,k<name> で後方
参照
MatchData#[sym] でマ...
例
str = "x = 128"
m = /A(?<var>[a-zA-Z_])s*=s*(?<val>d+)s*z/.match(str)
m[:var] # => "x"
m[:val] # => "128"
/A(?<var>[a-zA...
参考資料

詳説正規表現 (Mastering Regular Expressions)
Jeffrey E. F. Friedl 著

大林一平 (KMC/Dept. Math., Kyoto U./JST CREST)

中級正規表現

20...
Q&A
Q. 以下の 2 つの正規表現のうちどちらが良いの?
/"[^"]*"/ /".*?"/
A. 一般的に言って,最小量指定子は性能が良くないこ
とが多いようです (上の例では数%の差が生じるようで
す).また,最小量指定子を知らない人も...
Upcoming SlideShare
Loading in …5
×

中級正規表現

1,109 views

Published on

あまり知られていない正規表現の機能(3種類の量指定子の違い)を正規表現エンジンの内部的な挙動と関連付けて説明しています。おまけで名前付きキャプチャの説明もしています。

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,109
On SlideShare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
10
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

中級正規表現

  1. 1. 中級正規表現 大林一平 KMC/Dept. Math., Kyoto U./JST CREST 2013/08/17,24 Kobe Rubyist Meetup 1st +α 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 1 / 21
  2. 2. 自己紹介 大林一平 (ohai) 理学研究科数学教室 ▶ ▶ ▶ 特定研究員 力学系 最近は歩行の数理モデルの相空間のグローバルな力学 系構造の解析 Ruby ▶ ▶ るりま (http://doc.ruby-lang.org) Ruby/SDL 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 2 / 21
  3. 3. 題目 正規表現 NFA 絶対最大量指定子とアトミックグループ 先読み,後読み,アンカー 名前付きキャプチャ 参考資料 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 3 / 21
  4. 4. 正規表現 文字列を判別するためのプログラミング言語 ▶ ▶ 元は数学的な「言語」理論のために発明された DSL 高度な制御機構 ▶ ▶ 高い抽象性 後で説明する「バックトラック」 短く書ける構文 低い抽象化能力 ▶ 変数,関数,に相当する機能が貧弱 ⋆ ▶ ⋆ ▶ ないことはない 上部の言語 (Ruby) との連携能力が弱い 例えば正規表現の処理中に Ruby のコードを呼びだすこと はできない そのため何でも正規表現で処理するのはよくない 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 4 / 21
  5. 5. NFA Non determistic Finite Automaton 大半の正規表現エンジンで使われている仕組み ▶ ▶ Perl PCRE(Perl Compatible Regular Expression) ⋆ ▶ ⋆ ▶ PHP, Apache, R, etc. Oniguruma, Onigmo Ruby 1.9 以降, PHP5 以降 Python 別の仕組みとして DFA, Posix NFA, ハイブリッド, などがある DFA と比較して柔軟で複雑な処理が可能だが,性 能には劣る 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 5 / 21
  6. 6. NFA の利点と欠点 DFA と比べて以下の利点がある. 後方参照 1, . . . が使える 先読みなどができる さらなる拡張が可能 ▶ ▶ 条件分岐 部分式呼び出し Finite Automaton の数理的能力を越える 欠点は性能上 DFA に比べ劣ること.特に NFA の場合 は「うっかり」酷い性能の正規表現を書いてしまえる 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 6 / 21
  7. 7. バックトラック NFA の動作の基本原理 再帰呼び出しのようなもの ▶ 深さ優先探索 2 つの選択子がある場合,一方を保留しつつもう 一方のマッチを試す ▶ 例えば /a+b/ で “a” にマッチした場合, ⋆ ⋆ もう一文字 a のマッチをする b のマッチをする の 2 つがある 試したマッチがその先で失敗した場合,保留した ところまで戻って別の選択子を試す 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 7 / 21
  8. 8. /[abc]*b/.match("abbca") 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 8 / 21
  9. 9. /[abc]*b/.match("abbca") 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 9 / 21
  10. 10. /[abc]*b/.match("abbca") * は greedy なので,[abc] の繰り返しマッチを優先する 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 10 / 21
  11. 11. /[abc]*?b/.match("abbca") *? は reluctant なので,b のマッチを優先する 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 11 / 21
  12. 12. 最小量指定子の活用例 ダブルクオートで囲まれたテキストを取り出す. /"(.*?)"/ 普通の量指定子を使うと 3 つ以上のダブルクオートが 文字列に含まれていると問題になる. 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 12 / 21
  13. 13. 正規表現の性能 tree 構造によって性能は劇的に異なる. 特にマッチが失敗する場合はチェ ックする場合の 数が膨大になる可能性がある 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 13 / 21
  14. 14. 特に量指定子がネストしていると場合の数の爆発が起 きやすい /X(.+)+X/ 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 14 / 21
  15. 15. バックトラックの抑制 高機能な NFA エンジンには,バックトラックを抑制す る仕組みを持つものがある. 絶対最大量指定子 (possessive quantifier) ▶ 繰り返し内でのバックトラックを一切しない アトミックグループ ▶ グループ内のマッチが一度成功すると,その内側では バックトラックしなくなる 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 15 / 21
  16. 16. /[abc]*+b/.match("abbca") 水色の○の手前まで戻る (つまり失敗する) マッチが失敗しやすくなる ▶ 失敗したほうが都合が良い場合に使えなくもない 性能の向上に使える ▶ 特にマッチ失敗時の性能に良く効く 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 16 / 21
  17. 17. 例 メールヘッダの取り出し /A[^:]+:/ /A[^:]++:/ 絶対最大量指定子を使うと,メールヘッダ「でない」 場合には失敗するまでの計算時間が短くなる 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 17 / 21
  18. 18. 名前付きキャプチャ キャプチャや後方参照は通常 1, 2, . . . , という名前 が付けられる 識別子で名前を付けることができる (?<name>pat) でキャプチャし,k<name> で後方 参照 MatchData#[sym] でマッチ後に参照できる =~ でリテラル正規表現をマッチする場合はロー カル変数に束縛される $1 とかを使う必要がなくなる 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 18 / 21
  19. 19. 例 str = "x = 128" m = /A(?<var>[a-zA-Z_])s*=s*(?<val>d+)s*z/.match(str) m[:var] # => "x" m[:val] # => "128" /A(?<var>[a-zA-Z_])s*=s*(?<val>d+)s*z/ =~ str var # => "x" val # => "128" 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 19 / 21
  20. 20. 参考資料 詳説正規表現 (Mastering Regular Expressions) Jeffrey E. F. Friedl 著 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 20 / 21
  21. 21. Q&A Q. 以下の 2 つの正規表現のうちどちらが良いの? /"[^"]*"/ /".*?"/ A. 一般的に言って,最小量指定子は性能が良くないこ とが多いようです (上の例では数%の差が生じるようで す).また,最小量指定子を知らない人も多いので,前 者を使ったほうが良いように思われます.もっと複雑 な括弧の対応 (例えば HTML のタグ) を取る場合には最 小量指定子が役に立つでしょう. 大林一平 (KMC/Dept. Math., Kyoto U./JST CREST) 中級正規表現 2013/08/17,24 21 / 21

×