正規表現道場 Part2 (393レス)
前次1-
抽出解除 レス栞

111
(1): 2014/02/01(土)17:24 ID:??? AAS
Q、(*COMMIT) とは逆にマッチが成功したときだけ /g を止める最も簡単な手段は何か?

$_ = "123";
@test = $_ =~ m/1|2|3/g;
print "@test\n";

↑2 がマッチ成功したときに /g を止め、3がマッチしないようにする。
フラグ変数を用意、チェックすれば可能だがもっと手軽な手段はないか。
114
(1): 2014/02/02(日)10:19 ID:??? AAS
>>111
>>112 >>123
/g がループというのはちょっと違う.
リストコンテキストで評価したときはループと言えるが,スカラーコンテキストで評価したときはループではなく,
単に前回マッチした場所を覚えていて続きからマッチングを行うというだけ.

この問題はリストコンテキストで /g を評価したときに,マッチ成功後に途中で止めるいい方法はないかって言う問題だと解釈した.
スカラーコンテキストで評価したときに止めるんなら last を使えば簡単に止まる話.

つまり,while を使っていいんなら,
while (/1|2(*:STOP)|3/g) {
push(@test, $&);
last if $REGMARK eq 'STOP';
}
print "'@test'\n";

リストコンテキストで評価したときに途中で止めるには,かなり条件が限定されるが,
@test = $_ =~ m/(?(?<=2)\G(*COMMIT)(*FAIL))(?:1|2|3)/g;
ぐらいしか思いつかなかった.
これではフラグを使った方が簡単だろう.
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.669s*