SlideShare a Scribd company logo
中級正規表現
大林一平
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
自己紹介
大林一平 (ohai)
理学研究科数学教室
▶
▶
▶

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

Ruby
▶
▶

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

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

中級正規表現

2013/08/17,24

2 / 21
題目

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

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

中級正規表現

2013/08/17,24

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

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

高度な制御機構
▶
▶

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

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

変数,関数,に相当する機能が貧弱
⋆

▶

⋆

▶

ないことはない

上部の言語 (Ruby) との連携能力が弱い
例えば正規表現の処理中に Ruby のコードを呼びだすこと
はできない

そのため何でも正規表現で処理するのはよくない

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

中級正規表現

2013/08/17,24

4 / 21
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
NFA の利点と欠点
DFA と比べて以下の利点がある.
後方参照 1, . . . が使える
先読みなどができる
さらなる拡張が可能
▶
▶

条件分岐
部分式呼び出し

Finite Automaton の数理的能力を越える
欠点は性能上 DFA に比べ劣ること.特に NFA の場合
は「うっかり」酷い性能の正規表現を書いてしまえる

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

中級正規表現

2013/08/17,24

6 / 21
バックトラック
NFA の動作の基本原理
再帰呼び出しのようなもの
▶

深さ優先探索

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

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

もう一文字 a のマッチをする
b のマッチをする

の 2 つがある

試したマッチがその先で失敗した場合,保留した
ところまで戻って別の選択子を試す

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

中級正規表現

2013/08/17,24

7 / 21
/[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/17,24

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

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

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

中級正規表現

2013/08/17,24

11 / 21
最小量指定子の活用例

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

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

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

中級正規表現

2013/08/17,24

12 / 21
正規表現の性能

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

中級正規表現

2013/08/17,24

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

/X(.+)+X/

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

中級正規表現

2013/08/17,24

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

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

アトミックグループ
▶

グループ内のマッチが一度成功すると,その内側では
バックトラックしなくなる

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

中級正規表現

2013/08/17,24

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

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

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

性能の向上に使える
▶

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

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

中級正規表現

2013/08/17,24

16 / 21
例
メールヘッダの取り出し

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

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

中級正規表現

2013/08/17,24

17 / 21
名前付きキャプチャ
キャプチャや後方参照は通常 1, 2, . . . , という名前
が付けられる
識別子で名前を付けることができる
(?<name>pat) でキャプチャし,k<name> で後方
参照
MatchData#[sym] でマッチ後に参照できる
=~ でリテラル正規表現をマッチする場合はロー
カル変数に束縛される
$1 とかを使う必要がなくなる

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

中級正規表現

2013/08/17,24

18 / 21
例
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
参考資料

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

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

中級正規表現

2013/08/17,24

20 / 21
Q&A
Q. 以下の 2 つの正規表現のうちどちらが良いの?
/"[^"]*"/ /".*?"/
A. 一般的に言って,最小量指定子は性能が良くないこ
とが多いようです (上の例では数%の差が生じるようで
す).また,最小量指定子を知らない人も多いので,前
者を使ったほうが良いように思われます.もっと複雑
な括弧の対応 (例えば HTML のタグ) を取る場合には最
小量指定子が役に立つでしょう.

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

中級正規表現

2013/08/17,24

21 / 21

More Related Content

More from 京大 マイコンクラブ

多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換京大 マイコンクラブ
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会京大 マイコンクラブ
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」京大 マイコンクラブ
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編京大 マイコンクラブ
 

More from 京大 マイコンクラブ (20)

Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回
 
C#でゲームを作る2016 第5回
C#でゲームを作る2016 第5回C#でゲームを作る2016 第5回
C#でゲームを作る2016 第5回
 
C#でゲームを作る2016 第3回
C#でゲームを作る2016 第3回C#でゲームを作る2016 第3回
C#でゲームを作る2016 第3回
 

Recently uploaded

【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matchingharmonylab
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptxyassun7010
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。iPride Co., Ltd.
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptxssuserbefd24
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizesatsushi061452
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルCRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...atsushi061452
 

Recently uploaded (14)

【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 

中級正規表現