正規表現

Onigmo

気付くのが遅かったが、今日これを見つけた。 https://github.com/k-takata/OnigmoREADMEに新機能が書いてあるので、参考にすると良いかも。

PCRE 7.3

7.3がリリースされていた。 主な変更点は、 Perl 5.10で追加される(*PRUNE)等の対応 UTF-8の文字コードの範囲チェックを厳格化 (U+0000〜U+10FFFF) 範囲チェックは必要か? 自由にパターンを書けるほうが便利なこともあるのではないか。

Perl 5.9.5との機能比較(5)

正規表現パターンの再帰呼び出しについて、再帰が停止しないパターンのチェックは、どうなっているのかを調べた。相互呼び出しで再帰している場合も、以下のような単純なものであればチェックされる。 "aaa" =~ /(?<n1>(?&n2))(?<n2>(?&n1))/ #=> Pattern subroutine</n2></n1>…

Perl 5.9.5との機能比較(4)

同じ名前を重複して定義した場合の仕様を確認した。 後方参照では、一番左のグループだけを参照する。 "abcb" =~ /(a)(?'name'b)(?'name'c)\k'name'/鬼車の場合は、グループ番号の大きいものから順番に、マッチングが成功するまで全部参照する。理由があって…

Perl 5.9.5との機能比較(3)

Perlのnamed groupの動作を確認してみた。 named groupにはグループ番号も付加されている。これは鬼車と同じなので助かった。.NETの場合は違っていたような気がする。 "abb" =~ /(a)(?<name>b)\g{-1}/ #=> $1 = "a", $2 = "b"それにしても、\g{N},\g{name}で後方参</name>…

Keep pattern (4)

前回はPCRE 7.2での仕様を調べたが、今回はperl 5.9.5。 /()(a\Kb)/ =~ "ab" # $& = "b", $1 = "", $2 = "ab" /(?=ab\K)ab/ =~ "ab" # $& = "" /(?<=\Ka)b/ =~ "ab" # $& = "ab"この結果から、perlの\Kは captureには影響を与えない look-forwardとlook-behi…

有限オートマトン入門

有限オートマトン入門 POD版作者: 岩田茂樹,笠井琢美出版社/メーカー: 森北出版発売日: 2004/04/30メディア: 単行本 クリック: 1回この商品を含むブログ (2件) を見る八重洲ブックセンターで買った。有限オートマトンだけに絞っているので、他の本よりも詳し…

Keep pattern (3)

Keep patternの仕様について気になっていた点があったので、PCRE 7.2ではどうなっているのか調べてみた。 /()(a\Kb)/ =~ "ab" # (1,2), (0,0), (0,2) /(?=ab\K)ab/ =~ "ab" # (0,2) /(?<=\Ka)b/ =~ "ab" # compile errorこの結果から、PCREでの\Kは capture…

PCRE 7.2

一週間前にPCRE 7.2がリリースされていた。 前に書いたPerl 5.10の追加機能を一部取り込んでいる。僕も追加したいと思っていた\K(Keep pattern)も既に入っているようだ。

Keep pattern (2)

Keep pattern(\K)を繰り返しの中で使用すれば、最後の繰り返しの位置から前を除くことができるのだろうか。これはlook-behindでは実現できない。 /(?:abc\Kdef)+/

Keep pattern

以前、木村さんに教えてもらった、Perl 5.10の正規表現の機能拡張。 http://www.regex-engineer.org/slides/perl510_regex.htmlこの中のKeep pattern(\K)は、鬼車にも追加したいと思った。\Kよりも前の部分はマッチした範囲から除かれるという機能で、単純な…

partial matching

部分マッチについては、JRegexで知ったのだが、PCREにもあるというのは気付かなかった。http://www.gammon.com.au/pcre/pcrepartial.html鬼車に追加するのは、速度低下を気にしなければ可能だと思う。やる方向で検討しよう。それから、WikipediaにComparison…

PCRE 7.1

PCRE 7.1がリリースされていた。 PCRE_NEWLINE_ANYCRLFというのが追加された以外は、マイナーな変更だけのようだ。

Regular Expression Matching Can Be Simple And Fast

Regular Expression Matching Can Be Simple And Fastを読んで、Perlでの指数関数的発散の対処方法は、鬼車の実装方法と大体同じだろうということが分かった。 "Backtracking with memoization"と説明してあった。ところで、この論文に書いてある例をPerlで…

45rpm's bookmark

http://del.icio.us/45rpm/regex この日記のエントリも幾つかあった。 Perlでは、//が何にでもマッチする正規表現ではないというエントリが、一番面白かった。

素数判定

ruby-talk:244371 正規表現を使って、こんなに簡単に素数判定ができるとは知らなかった。 ruby -wle 'puts "Prime" unless ("1" * ARGV[0].to_i) =~ /^1$|^(11+?)\1+$/' 37大きい数に対しては、繰り返し回数の上限を指定したほうが速そうだ。 /\A(?:x|(xx{1,…

JRegex

JRegex: Javaの正規表現ライブラリ。 Incomplete matchingという機能が特徴。 与えられた文字列が正規表現全体にマッチできなくても、文字列全体で正規表現の最初の部分にマッチできれば成功になるということ。 何の役に立つのか分からなかったが、実際に動…

正規表現入門

正規表現入門 (I・O BOOKS)作者: 平田豊出版社/メーカー: 工学社発売日: 2007/02メディア: 単行本 クリック: 8回この商品を含むブログ (6件) を見る上記の本に載っていた [a-z-[bc]]について、木村さんに教えてもらった。 本の初版の時点で、Javaのドラフト…

真空マッチ (4)

昨日紹介したページに書かれていた例で、(b)*の部分を(?:(b)+|)に書き直して実行してみる。 $ ruby -e '"abax" =~ /((a)*(?:(b)+|))*/; print "#{$&}:#{$1}:#{$2}:#{$3}\n"' aba:a:a:b $ ruby19 -e '"abax" =~ /((a)*(?:(b)+|))*/; print "#{$&}:#{$1}:#{$2}…

真空マッチ (3)

/((a)*(b)*)*/ =~ "abax"のキャプチャ結果が、$1 = '', $2 = nil, $3 = nilになるというのは、次のように解釈できる。 一番外側の繰り返しの二周目で、一周目のキャプチャ結果をクリア(nil)にしてから改めてマッチングを試みる。その結果、(a)*と(b)*が零回…

真空マッチ (2)

やっぱり違うな。訂正。 正しいというか、仕様が最も一貫しているのは $1 = '', $2 = 'a', $3 = 'b' だけ。 理由は後で書く。

真空マッチ (1)

http://www.siaris.net/index.cgi/Programming/LanguageBits/Ruby/Oniguruma.rdoc/style/printこの中で、ruby、鬼車、perlの仕様の違いが指摘されていた。 $ sruby -e '"abax" =~ /((a)*(b)*)*/; print #{$&}:#{$1}:#{$2}:#{$3}\n"' aba::a:b $ oruby -e '"a…

正規表現入門

正規表現入門 (I・O BOOKS)作者: 平田豊出版社/メーカー: 工学社発売日: 2007/02メディア: 単行本 クリック: 8回この商品を含むブログ (6件) を見る同じ著者の「Linuxカーネル解析入門」が良かったので、買ってみた。 java.util.regexの説明の中で、一箇所だ…

PCREのベンチマーク

PCREのバージョン間で、どの程度処理時間が変わるかを調べてみた。 (PCRE 6.3を1.0として) PCRE 6.3: 1.00 PCRE 6.7: 1.02 PCRE 7.0: 0.957.0で少し速くなっているようだ。

PCRE 7.0

PCRE 7.0が出ていることを昨日知った。 主な変更点は、Unicode PropertyがUnicode 5.0に更新されたことと、Named groupの表記が.NETと同じものをサポートしたことなど。 鬼車のnamed groupも、.NETの表記を参考にして決まったもの。(subexp callを除く) (?<name>..</name>…

Vertical Tab

以前に書いた、Perlでは空白文字種を表す機能が全て同じではなく、VT(0x0b)文字をスペースに含めるかどうかが違う(過去との互換性のため?)ことについて、実際に確認してみた。 Perl 5.8.6 [[:space:]], \p{Space} : VTにマッチ \s, \p{SpacePerl} : VTにマ…

Pythonのinvalid expression (2)

一体何の為のエラーなのだろうか。 空文字列にもマッチできる部分パターンの無限回繰り返しは、何も対処をしていないと、場合によっては永久に停止しなくなる。そのためのチェックを普通はマッチング処理の中で行うが、パターンの解析時点でエラーにしてしま…

Pythonのinvalid expression

前に、ruby-talk:217061で、Pythonの場合、以下の正規表現がエラーになることを書いた。 import re s = ("a"*300)+"b" re.search(r'^(a*)*$', s) # invalid expression木村さんからエラーになる条件を教えてもらったので、自分でも少し調べてみた。 まず、a*…

第三版

Mastering Regular Expressions: Understand Your Data and Be More Productive作者: Jeffrey E. F. Friedl出版社/メーカー: O'Reilly Media発売日: 2006/08/18メディア: ペーパーバック クリック: 3回この商品を含むブログ (5件) を見る第二版からまだ四年…