Smalltalk
で正規表現ラ
イ
ブラ
リ
を使う
第
10
回
Smalltalk
勉強会
正規表現
文字列集合を表す文字列
一般的には文字列のパタ
ーンマッ
チに利用
例
[ A-Z] [ ¥w¥d] *
先頭が大文字アルファベット、それ以降は0個以上
正規表現の用途
文字列が関わる部分なら
どこ
でも
適用可
用途例
入力チェ
ッ
ク
特定文字列の抽出
テンプレート
エンジン
ゲノ
ム解析
正規表現
I P
アド
レスにマッ
チ
(25[0- 5] ¦
(2[ 0- 4] ¦
1[ 0- 9] ¦
[1- 9] )?[ 0- 9])¥
.
(25[0- 5] ¦
(2[ 0- 4] ¦
1[ 0- 9] ¦
[1- 9] )?[ 0- 9])¥
.
(25[0- 5] ¦
(2[ 0- 4] ¦
1[ 0- 9] ¦
[1- 9] )?[ 0- 9])¥
.
正規表現
HTTP URL
にマッ
チ
(?:https? ¦shttp):/ / (?:(?:[ - _.!~ *'()a- zA- Z0- 9;:&=+$,] ¦%[ 0- 9A- F
a-f] [ 0- 9A- F a- a-f] )*@)? (?:(?:[ a- zA- 9] (?:[ - a- zA- 9] *[ a- zA-
Z0-9] )?¥.)*[ a- zA- Z] (?:[ - a- zA- Z0- 9] *[ a- zA- Z0- 9] )?¥.?¦[ 0- 9] +¥.[
0-9] +¥.[ 0- 9] +¥.[ 0- 9] +)(? ::[ 0- 9] *)? (?:/ (? :[ - _.!~ *'()a- zA-
Z0-9:@&=+$,] ¦%[ 0- 9A- F a- f] [ 0- 9A- F a- f] )*(?:;(?:[ - _.!~ *'()a- zA-
Z0-9:@&=+$,] ¦%[ 0- 9A- F a- f] [ 0- 9A- F a- f] )*)*(?:/ (?:[ - _.!~ *'()a- zA-
Z0-9:@&=+$,] ¦%[ 0- 9A- F a- f] [ 0- 9A- F a- f] )*(?:;(?:[ - _.!~ *'()a- zA-
Z0-9:@&=+$,] ¦%[ 0- 9A- F a- f] [ 0- 9A- F a- f] )*)*)*)? (?:¥? (?:[ - _.!~ *'()a-
zA-Z0- 9;/ ?:@&=+$,] ¦%[ 0- 9A- F a- f] [ 0- 9A- F a- f] )*)?(? :#(? :[- _.!~
正規表現
I P
アド
レスにマッ
チ その
2
1.
ド
ッ
ト
で区切ら
れた
4
組の数字を抽出
(¥
d+)¥
.(¥
d+)¥
.(¥
d+)¥
.(¥
d+)
2.
数字を抜き出し
てから
プログラ
ムで処理
正規表現ラ
イ
ブラ
リ
その1
Vassili Bykov
’
s Regular Expression Matcher
(
VBRegex)
Pure Smalltalk
マルチバイト文字列でも利用可
利用可能な処理系
VisualWorks
Regex11
Squeak
VBRegex
VBRegex
のイ
ンスト
ール(
VisualWorks)
Cincom Public Store
から
最新版
Store -> Published I tems -> Regex11
[ 1.3.1]
標準添付のパーセルから
ちょ
っ
と
古い
Percel Manager -> Advanced Utilities ->
VBRegex
のイ
ンスト
ール(
Squeak)
SqueakSourceから
最新版
http: / / www.squeaksource.com/ Regex.html
最も新しいものを取得してSqueakにDrag&Drop
Universeから
ちょっと古い
WorldMenu –> open… -> Universe Browser (basic) -> Model Extensionカテゴリ-> VBRegex version 1.9
SqueakMapから
かなり古い
VBRegex
の使い方
以下を参照
RxParser class
の
DOCUMENTATI ON
カ
テゴリ
以下のメ
ソ
ッ
ド
群
VBRegex
の使用例
マッチ
'192.168.0.1' matc hesR egex: '(¥d+)¥.(¥d+)¥.(¥d+)¥.(¥d+)'
=> true
全マッチ文字列に対する操作
'abc .de.f.gh.ijk' regex: '¥w+' matc hesDo: [:m ¦ T ransc ript c r; show: m] . 'abc .de.f.gh.ijk' regex: '¥w+' matc hesC ollec t: [:m ¦ m asUpperc ase]
=> an OrderedC ollec tion('ABC ' 'DE ' 'F ' 'GH' 'IJ K')
全置換
'abc .de.f.gh.ijk' c opyWithR egex: '¥.' matc hesR eplac edWith: '#'
鬼車
for VisualWorks
正規表現ラ
イ
ブラ
リ 鬼車の
VisualWorks
バイ
ンディ
ング
Win32, Linux
に対応
OS Xには未対応
開発環境があればすぐ対応できる。多分。
正規表現ラ
イ
ブラ
リ 鬼車
様々な文字列エンコ
ーディ
ングに対応
30
種
UTF-8, UTF-16, UTF-32, EUC-JP, Shift_JI S, etc
様々な正規表現パタ
ーン文法をサポート
Ruby, Perl, Java, etc
マルチプラ
ッ
ト
フ
ォ
ーム対応
UN* X
(
Linux, OS X, etc), Win32, Cygwin
メ
ジャ
ーな言語処理系で正式採用
鬼車
for VW
の特徴
Ruby
の正規表現周り
を
丸パク大いに参考
不自然ではない範囲で準拠
API
match, sub, gsub, index, scan, split, = ~ , etc
正規表現パタ
ーン文法
テスト
ケース
Ruby
のラ
イブラ
リ
を
パクり取り
込みたい
鬼車
for VW
の特徴 その
2
機能が豊富
各所で紹介さ
れている正規表現がその
まま流用可能
詰まると
こ
ろ、
鬼車のエンジンが優秀
API
が比較的シンプル
鬼車
for VW
の特徴 その
3
現在の実装では並行処理不可
外部ラ
イ
ブラ
リ
呼び出し
中は、
Smalltalk
側のプ
ロセスがほぼ停止状態
要マルチスレッド対応
VBRegex
より
速度が出ない
関数コ
ールが重い
呼出し、結果受け取り
文字列の変換、
コ
ピーが重い
外部ラ
イ
ブラ
リ
の配置
Win32
onigvw.dllをパスの通った場所にコピー
Linux
libonigvw.so.x.x.xを/ usr/ local/ libにコピー
/ usr/ local/ libにシンボリックリンク作成
簡単なインストールスクリプトは準備してある
パーセルの読み込み
Regexp-Oniguruma.pcl
のロード
マッ
チ その
1
'S malltalk' matc hReg: 'S malltalk'
=> {S malltalk : #()}
'S mallT alk' matc hReg: 'S malltalk'
=> nil
'S mallT alk' matc hReg: ('S malltalk'
asORegexpWithOptions:
(Array with: OOption IGNOR EC AS E ))
=> {S mallT alk : #()}
'S mallT alk' matc hReg: ('S malltalk' asOR egexpWithOptions: 'i')
=> {S mallT alk : #()}
'S mallT alk' matc hReg: ('S malltalk' regWith: #i).
マッ
チ その
2
matc h := '192.168.0.1' matc hR eg: '(¥d+)¥.(¥d+)¥.(¥d+)¥.(¥d+)'
=> {192.168.0.1 : #('192' '168' '0' '1')}
matc h matc hedS tring => '192.168.0.1'
matc h c aptures => #('192' '168' '0' '1')
matc h at: 1 => '192
matc h at: 2 => '168'
matc h at: 3 => '0'
置換
'abc .de.f.gh.ijk subR eg: '¥.' with: '?'
=> 'abc ?de.f.gh.ijk'
'abc .de.f.gh.ijk' subReg: '¥w+' with: '(¥0)'
=> '(abc ).de.f.gh.ijk'
'abc abc '
subReg: ¥w+
with: [:matc h ¦ '(<1s>)' expandMac rosWith: matc h matchedS tring asUpperc ase].
=> 'a(B)c abc '
dic := Dic tionary new at: 'b' put: 'X X X ';
at: 'd' put: 'ZZ Z';
yourself.
'abc dabc d' subReg: '[bd]' with: dic
全置換
'abc .de.f.gh.ijk' gsubR eg: '¥.' with: '?'
=> 'abc ?de?f?gh?ijk
'abc .de.f.gh.ijk' gsubR eg: '¥w+' with: '(¥0)'
=> '(abc ).(de).(f).(gh).(ijk)'
'abc .de.f.gh.ijk'
gsubReg: ¥w+
with: [:matc h ¦ '(<1s>)' expandMac rosWith: matc h matchedS tring asUpperc ase].
=> '(ABC ).(DE).(F ).(GH).(IJ K)'
dic := Dic tionary new at: 'b' put: 'X X X ';
at: 'd' put: 'ZZ Z';
yourself.
'abc dabc d' gsubR eg: '[bd]' with: dic
分割
'abc .de.f.gh.ijk' splitR eg: '¥.'
=> #('abc ' 'de' 'f' 'gh' 'ijk')
'今日の天気は快晴' splitR eg: '[ ぁ- ん] '
走査
'貴社の記者が汽車で帰社した' sc anR eg: '([ 一- 龠々] +)([ ぁ- ん] *)'
応用例
src := 'T inyS egmenterはJ avasc riptだけ書かれた極めてコンパクトな日本語分かち書きソフトウェアで す。わずか25kバイトのソースコードで、日本語の新聞記事であれば文字単位で95%程度の精度で分か ち書きが行えます。Y ahoo!の形態素解析のようにサーバーサイドで解析するのではなく、全てクライア ントサイドで解析を行うため、セキュリティの観点から見ても安全です。分かち書きの単位はMeC ab + ipadic と互換性があります。'.
ws := WriteS treamon:S tring new. (T inyS egmenternew segment: src )
do:[ :eac h ¦ ws nextP utAll:each]
separatedBy: [ ws nextP utAll:' ¦ '] . ws c ontents
=> 'T inyS egmenter ¦ は ¦ J avasc ript ¦ だけ ¦ 書か ¦ れ ¦ た ¦ 極め ¦ て ¦ コンパクト¦ な ¦ 日本 ¦ 語分 ¦
かち ¦ 書き ¦ ソフトウェア ¦ です ¦ 。わ ¦ ずか ¦ 2 ¦ 5 ¦ k ¦ バイト¦ の ¦ ソースコード¦ で ¦ 、¦ 日本語 ¦ の
¦ 新聞 ¦ 記事 ¦ で ¦ あれ ¦ ば ¦ 文字 ¦ 単位 ¦ で ¦ 9 ¦ 5 ¦ % ¦ 程度 ¦ の ¦ 精度 ¦ で ¦ 分かち ¦ 書き ¦ が ¦
行え ¦ ます ¦ 。¦ Y ahoo! ¦ の ¦ 形態 ¦ 素解 ¦ 析 ¦ の ¦ よう¦ に ¦ サーバーサイド¦ で ¦ 解析 ¦ する ¦ の ¦
で ¦ は ¦ なく¦ 、¦ 全 ¦ て ¦ クライアントサイド¦ で ¦ 解析 ¦ を ¦ 行う¦ ため ¦ 、¦ セキュリティ¦ の ¦ 観点
¦ から ¦ 見 ¦ て ¦ も ¦ 安全 ¦ です ¦ 。¦ 分かち ¦ 書き ¦ の ¦ 単位 ¦ は ¦ MeC ab + ipadic ¦ と ¦ 互換 ¦ 性 ¦
まと
め
Smalltalk
処理系でも
正規表現ラ
イブラ
リ
は
普通に利用できます
文法も
概ね一般的なも
のが利用できます