正規表現道場 Part2 (393レス)
上下前次1-新
114(1): 2014/02/02(日)10:19 ID:??? AAS
>>111
>>112 >>123
/g がループというのはちょっと違う.
リストコンテキストで評価したときはループと言えるが,スカラーコンテキストで評価したときはループではなく,
単に前回マッチした場所を覚えていて続きからマッチングを行うというだけ.
この問題はリストコンテキストで /g を評価したときに,マッチ成功後に途中で止めるいい方法はないかって言う問題だと解釈した.
スカラーコンテキストで評価したときに止めるんなら last を使えば簡単に止まる話.
つまり,while を使っていいんなら,
while (/1|2(*:STOP)|3/g) {
push(@test, $&);
省7
115: ◆QzqhRqBYxktP 2014/02/02(日)14:00 ID:??? AAS
>>114
>ループというのはちょっと違う
そのへんはちゃんと理解してるから大丈夫。foreachとか<>みたいなつもりで書いてるから。
>リストコンテキストで /g を評価したときに,マッチ成功後に途中で止めるいい方法はないか
その通り。
>(*:STOP)
これはフラグ変数を使うやり方とまったく同じだからボツ・・。{ } の中で last するのはナシ。
m/ / の中で止められないか、という話だから。
しかも$REGMARKと$REGERRORは予期しない動きをすることがあるから
普通にフラグを使ったほうが確実。(後述)
省2
116: 2014/02/02(日)14:08 ID:??? AAS
## $REGERROR
# マッチ失敗でも$REGERRORが偽を返す例
$_ = "11";
m/^(*MARK:NAME)12/;
if ($REGERROR){ print "yes\n" }else{ print "no\n"; };
結果 → no
# 2 を (?!) や (*FAIL) に変えると・・?
m/^(*MARK:NAME)1(?!)/;
結果 → yes
省1
117(1): 2014/02/02(日)14:12 ID:??? AAS
あれ、$REGMARK が予期しない動作になるデータはないや。
ごめん、使えないのは $REGERROR だけかも。
118(1): 2014/02/02(日)14:30 ID:??? AAS
>単に前回マッチした場所を覚えていて続きからマッチングを行うというだけ
あ、ちゃう、これ分かってなかった。場所覚えてるだけだったのか、違和感感じてたんだけど
やっと理解出来たよ、ありがとう。
あと雑技たんのサイトだけど
>回文にマッチする正規表現 # 再帰版
× (??{$palindrome})*
○ (??{$palindrome})?
だね。前者だと回文を繋げた文字列 121454989・・・ みたいなのを拾ってしまう。
119(1): 2014/02/02(日)20:34 ID:??? AAS
>>117
確かに $REGERROR は期待通りに動かないな.
>>118
回文の間違い指摘ありがとう.
120: ◆QzqhRqBYxktP 2014/02/02(日)20:50 ID:??? AAS
おや、出来ちゃった・・
# リストコンテキスト + /p のマッチング中に break する。
$_ = "123";
@test = $_ =~ m/
1
|2
(?{ $last = "${^MATCH}"; })
(*COMMIT)(*F)
|3
/xgp;
省16
121: ◆QzqhRqBYxktP 2014/02/03(月)07:41 ID:??? AAS
↑× /p のマッチング中に → /g の間違い
----------------------------------------------
# 先読みの中の (*SKIP) は正しく機能する。(× >>112)
$_ = "123";
@test = $_ =~ m/1|2(?=.*\z(*SKIP)(*F))|3/g;
print "@test\n";
# 結果 → 1
# 先読みの中の (*SKIP) が失敗する例もある
@test = $_ =~ m/1|2(?=.*\z(*SKIP))(*F)|3/g;
# 結果 → 1 3
省15
122: 2014/02/03(月)17:57 ID:??? AAS
# リストコンテキスト + /g のマッチング中に break する。(perl 旧verl対応版)
$_ = "12223";
@test = $_ =~ m/
1
|2
(?{ $last = "$&"; })
.*\z # 余った文字列を全部マッチさせる。
|3
/xgs;
$test[$#test] = $last; # 最後の要素の入れ替え
省2
123(1): ◆QzqhRqBYxktP 2014/02/04(火)13:37 ID:??? AAS
・$REGERROR を (?{code}) と入れ替えて実験
my $cnt = 0;
$_ = "11";
m/^(?{ $cnt++;})1(*F)/;
print "$cnt\n";
# 結果 → 1
my $cnt = 0;
$_ = "11";
m/^(?{ $cnt++;})12/;
print "$cnt\n";
省2
124(2): 2014/02/04(火)13:39 ID:??? AAS
皆様、こんにちは 質問させてください
テキスト内の文字を置き換えるアプリ(Devas)で作業をしています
正規表現で文字検索と置き換えしたいのですが表現法がわかりませんので
詳しい方アドバイス下さいませんでしょうか?
テキスト内には
.(ドット)abc"IMG
.(ドット)def"IMG
.(ドット)ghr"IMG
など . と "IMG で囲まれた数パターンの文字列がありこれに元文字列を利用し .photo を付け加えたいのです
省5
125(3): ◆QzqhRqBYxktP 2014/02/04(火)13:41 ID:??? AAS
・開始タグと閉じタグの間に文字列を含まない正規表現 (正規表現 否定 除く)
$_ = "ABC ABC DEF ABCDEF";
while ( m/
# Perl 5.10 以降で有効
ABC
[^ADX]* # 先頭の文字を使った高速処理
(?:
(?:
DEF (*ACCEPT) # マッチ成功
|\K ABC # 今までマッチした文字列を捨ててリスタート
省10
126: 2014/02/04(火)20:09 ID:xuvSG1oC(1) AAS
s/^\./.photo./g
行頭限定の場合
127: ◆QzqhRqBYxktP 2014/02/05(水)16:22 ID:??? AAS
>>124
<検索>
\.([a-z\d]{1,4}"IMG\b)
<置換>
..photo.$1
\. を ( ) に入れてないのは処理効率を上げるため。
「abc」の部分は拡張子と考えて数字も許可した。(1文字以上4文字以下の英数字)
何かまずかったら遠慮なく。
128(1): 124 2014/02/06(木)18:00 ID:??? AAS
たくさんレスいただきましてありがとうございます
お礼が遅れまして申し訳ありません
127様の \.([a-z\d]{1,4}"IMG\b) で無事検索できることができました
しかし置き換えでは マッチした文字列が ..photo.$1 に置き換わるだけで $1にマッチした語句が適応されません
検索結果
○○○○○○.abc" IMG が ○○○○○○..photo.$1 となります
希望では
○○○○○○.photo.abc" IMG となることです(単純に .拡張子 前に .photo を入れたい)
先の書き込みでの訂正がありました 申し訳ありません
検索したい文字列には " と IMG の間に半角スペースがありました
省3
129(1): ◆QzqhRqBYxktP 2014/02/06(木)20:27 ID:??? AAS
>>128
ごめんなさい、こちらにも見落としがいくつかありました。
( Devasにはメジャーな正規表現エンジンが使われていると考えて作りましたが違ったようです )
・通常版 (上行=検索、下行=置換)
\.[a-zA-Z\d]{1,4}" ?IMG\b
.photo\0
・拡張子を小文字に変換する版 (例 .JPG → .jpg )
\.([a-zA-Z\d]{1,4})(" ?IMG\b)
.photo.\L\1\E\2
・ 「"」 と IMG の間のスペースがあっても無くてもスペース1個にする版
省5
130: 2014/02/06(木)22:22 ID:??? AAS
>>129
度々のレスありがとうございます
正規表現エンジンにもいろいろなものがあるとは知りませんでした
お手数をおかけいたしまして申し訳ありません
いくつものパターンを示してくださいまして
重ねて感謝いたします
通常版にて理想の変換ができました
今回教えて頂いたような知識を深めて、もっと便利にPCを使えるようになりたいと思います
勉強になりました ありがとうございます m(_ _)m
131: 2014/02/09(日)02:41 ID:??? AAS
質問させてください。
phpのpreg_match関数でwebページから文字列を抽出したいと考えています。
以下を使用して抽出していますが、改行が含まれると抽出ができませんでした。
$text = '/value="(.*?)" id="latest"/';
preg_match($text, $source, $matches);
$word = $matches[1];
色々調べて$textを以下のようにしてみましたが、うまくいきませんでした。
$text = '/value="(.*?)" id="latest"/s';
$text = '/value="([\s\S]*?)" id="latest"/';
$text = '/value="((\n|.)*?)" id="latest"/';
省2
132: 2014/02/09(日)08:07 ID:J9pikab5(1/2) AAS
俺なら
/value="([^"]*)"\s+id="latest"/
133: ◆QzqhRqBYxktP 2014/02/09(日)17:20 ID:??? AAS
× ' '
○ " "
というオチ?PHPは触らないから分からない。
上下前次1-新書関写板覧索設栞歴
あと 260 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.374s*