404 motivation not found | t_ishidaのブログ

2月/08

25

正規表現の先読み・戻り読み

理解した気になっていた正規表現の先読み、戻り読みが、ちゃんと使えていない。しっかり理解し直すこと。

否定先読み

つまり、先読みってposition的に先になるっちゅーこと。

これは理解した気になっていた通り。

例)

'(?:.*?(?!\\)(?!').*?)*?'

が、否定だから予測が立たないので幅を持てる正規表現ではない。んー、ラクダ本読み直して「理解した気」になり直した。でも、ラクダ本の例では”幅を持った”正規表現が否定先読み中に使われている気がするが・・・この辺よく分からん。*1

で、これの面白いところがネット上で探しても何がなんだか分からない例ばっかで、適当な事を書いているようにも見える位に分からない事を書いているサイトが多い気がする。

上記の例について順を追って説明すると。*2

  1. シングルクォートが来るのね?
  2. (?:を見て、これグループね?
  3. んと、最小マッチね?だから、次のパターンを見とくよ。
  4. 次は、否定先読みか~。前のパターンの右先方に\が来ちゃ駄目なのね?
  5. さらに次は、否定先読みか~。’が来ちゃ駄目なのね?
  6. つまり、なんらかの文字の0個以上の連続の後に\’が来ちゃ駄目なのね。
  7. んと、さらに最小マッチね
  8. ここでグループ終了ね?
  9. で、そのパターンが0個以上の後にシングルクォートが来るのね?

と、解釈するはず。

つまり、\’を無視して引用符に囲まれた文字列にマッチさせる正規表現。

  • PSON::decodeを作ること。多分↑が必須になるよね?
    • そんな置換するより、むしろからPerlで帰ってくるならPerlでtoPHPメソッドを作った方が楽な事に気づいた。
  • フレームワーク(笑)の開発しないと。
print toPHP([1,2,3,{aaa=>'bbb'}]) , "\n";
sub toPHP{
my $data = shift;
ref $data  eq 'HASH' && return "array(" . join( ',', map{ "'$_' => ". toPHP( $data->{$_} ) } keys %{$data} ) . ")";
ref $data  eq 'ARRAY'&& return "array(" . join( ',', map{ toPHP( $_ ) } @{$data} ) . ")";
return $data =~s/'/\\'/g && $data =~/^(?:[1-9]\d+|\d)$/ ? "$data" : "'$data'" ;
}

*1id:dankogai氏辺りに”これだからPHPユーザーは”とか、disりながら上手い説明をして欲しいところだ。

*2:実装は知らん、結果からの推測

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 集合知と集合愚

PSONクラス >>

Find it!

Theme Design by devolux.org

Tag Cloud