2009年8月アーカイブ

ネタ元→ 正規表現でn回目の出現にマッチってどうやるんだろう
にあまり深く考えずに
(?:pattern){N-1}(pattern) とか?
と返したわけだが、どう考えてもこれは「N個のパターンにマッチして、最後のパターンをキャプチャする」正規表現だ。ていうか
最後のパターンを後で参照したいだけならキャプチャ有り無しで分けずに(pattern){N} で十分だよ...

N個目のパターンにマッチする とはすなわちマッチ全体(Perlで言うと $&)がN個目のパターンになってなきゃいけないので、zero-width-look-behindを使って (?<=(?:pattern){N-1})pattern とするのが正解ですかね。

気をつけなければいけないのは、 Perlでの zero-width-look-behind はlook-behindするパターンにマッチする文字列の長さが確定していなければいけないこと。量指定子(*,+,? もしくは {n,m}) が含まれていてマッチする文字列の長さが確定できない場合は使えない。({n}は、固定の量指定子なので使える)

まとめると、

# 5個目のパターン(a5)を取り出したい
my $text = 'a1a2a3a4a5a6';
my $pat = qr/a\d/;
$\="\n";
print $1 if $text =~ m/(?:$pat){4}($pat)/; # $`='', $&='a1a2a3a4a5', $'='a6', $1='a5'
print $1 if $text =~ m/($pat){5}/; # ditto
print $& if $text =~ m/(?<=(?:$pat){4})$pat/; # $`='a1a2a3a4' $&='a5', $'='a6'
# ↓これは間違い
print $& if $text =~ m/(?<=$pat){4}$pat/; # $`='a1' $&='a2', $'='a3a4a5a6'
 
# 5個目のパターン(aa5)を取り出したい
$text = 'a1a2aa3a4aa5a6';
$pat = qr/aa?\d/;
print $1 if $text =~ m/($pat){5}/; # $`='', $&='a1a2aa3a4aa5', $'='a6', $1='aa5'
$text =~ m/(?<=(?:$pat){4})$pat/; # エラー

Net::Twitter は 相変わらずAPI引数のvalueだけをencode_utf8してくださるので、use utf8環境下で非ASCII文字をAPI引数のvalueに渡すと文字化けさせてくれます。文字化けの原因は以前に書いた通り

use utf8;
use Net::Twitter;

my $twitter = Net::Twitter->('略');
my $status = '日本語';
$twitter->update({status => $status}); # 文字化ける

no utf8 でkeyにUTF8フラグを付けないようにしておくと文字化けないです。

use utf8;
use Net::Twitter;

my $twitter = Net::Twitter->('略');
my $status = '日本語';
{ no utf8;
$twitter->update({status => $status}); # 文字化けない
}

もしくはkeyを全部encode_utf8してUTF8フラグを落としておくとか、しかしめんどくさい

気が付けばもうC76の開催は今週末ですね。

自分は3日目だけ一般参加予定です。2日目の同人ソフトや東方系もとても気になるのですが、今回は我慢。

さて、今回下記の2箇所にそれぞれゲスト参加としてイラスト1枚ずつ寄稿させていただきました。

そんなわけで、皆様におかれましても是非に是非に

とかいうものを作ってみました。-> Twintersection

Twitter上の「あの子とあの子に共通なFollower」とか「あの子のmutual friends」とかが割と簡単に調べられます。
p. めんどくさいから TwitterAPIを利用する都合で、1ユーザあたり最大100件ずつ(最新100件)しかFollower/Followingを読み込みませんが、まぁ、何とかなるもんです。(ぇ

何かバグってたらコメントなり twitterで@するなどして教えていただけると助かります。

今日見たコード。(単語は適当に無難なものに差し替えた)

def func(filename)
  category="(cat1|cat2)"
  ver2="(\d+)\.(\d+)"
  ver3="(\d+)\.(\d+)\.(\d+)"
  targz="\.tar\.gz"
  case filename
  when /pfxTypeA-#{category}-(.*)-#{ver3}-(.*)#{targz}/
    [ :TypeA, Regexp.last_match[1], Regexp.last_match[6],
      Regexp.last_match[3],
      Regexp.last_match[4],
      Regexp.last_match[5], ]
  when /pfxTypeB-#{category}-(.*)-#{ver3}-(.*)#{targz}/
    [ :TypeB, Regexp.last_match[1], Regexp.last_match[6],
      Regexp.last_match[3],
      Regexp.last_match[4],
      Regexp.last_match[5], ]
  when /pfxTypeC-#{ver2}-(.*)#{targz}/
    # 以下略
  end
end

特定のフォーマットにしたがって命名されたファイル名を要素毎に分解するrubyのコードだけど、最初のwhen節を読み終わるまでに視線がが上下に2,3往復、キャプチャの括弧と後方参照の対応を指差し確認すること2回程。いやはや読みづらい。

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic