トップページ⇒php
1001コメント313KB

正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/11/19 21:42ID:Kst3Nn4S
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、&amp " と描いておきましょうね。

Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
 http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
 http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
 http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
 http://www2.famille.ne.jp/~akio1998/l_grep.html

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
0042nobodyさん03/12/09 16:39ID:???
timeで時間を取得して3の倍数の分なら処理をしようとしたんですが、ググッて調べた
下の書き方だとエラーが出てしまいます。どこか間違ってるんでしょうか?

if ($min =~ ^(\d+)(?(?{$1 % 3})(?!))$){
0043 03/12/09 16:41ID:???
正規表現を使おうとしてるところ?
0044 03/12/09 16:45ID:5gjkqVTX
>>35
それを言っちゃあおしめえよ。
0045nobodyさん03/12/09 17:51ID:???
>>43
正解
0046nobodyさん03/12/11 14:45ID:jBSAkNSo
テキストファイル中で「$replace[XXXXX]」となっている部分を
「XXXXX.html」に置き換えるような処理はどうすればよいでしょうか?
XXXXXが可変です。
0047nobodyさん03/12/11 14:52ID:???
大括弧の中を取得して、それに.htmlを付加すればOK。
0048nobodyさん03/12/11 15:00ID:???
>>46
さあ、添削してやるから書いてみれ。
00494603/12/11 15:14ID:jBSAkNSo
一応でけました。
初心者なんで、最適化も何もない&さっき質問したのと話がちょっと違うけどお願いします。
文字列に含まれる$img[XXXXX]の中身XXXXXを関数に渡して、その処理結果で置き換える、ということです。

$test = 'aaa <a href="test.pl"><img src="$img[test1]"></a><img src="$img[test2]">';
$test =~ s/(\$img\[)(\w+)(\])/func($2)/ge;
print $test;

sub func{
local($id)=@_;
if($id eq "test1"){
return "test1が渡されたよ";
}
return "test2が渡されたよ";
}
0050nobodyさん03/12/11 15:38ID:???
>>49
おおう、いいんじゃない。前後はカッコ要らんけど。
$test =~ s/\$img\[(\w+)\]/func($1)/ge;
0051nobodyさん03/12/11 21:09ID:???
>>42
if ($min =~ /^(\d+)(?(?{$1 % 3})(?!))$/){

=~の右辺は正規表現だから、m/正規表現/、その省略形、/正規表現/
0052nobodyさん03/12/11 21:11ID:???
むむ?=~はパターンマッチ…
0053nobodyさん03/12/14 11:28ID:9SKP9sfi
http://cgupload.dyndns.org/~upuser/up2/imgboard.cgi
ここの2ページ以降の正規表現おしえてください
0054nobodyさん03/12/14 12:18ID:???
その内容を要約してここに書きなさい。
0055nobodyさん03/12/14 12:19ID:9SKP9sfi
>>54
http://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi
この掲示板の2ページ目、3ページ目のURLが
知りたいんですが、どのページも同じURLなんです・・・・
2ページ目はどうやれば指定できるんでしょうか?
何か元になるURLに付記すればいいのでしょうか?教えてください・・

0056nobodyさん03/12/14 12:29ID:9SKP9sfi
あまちがえた ここ

http://cgupload.dyndns.org/~upuser/up2/imgboard.cgi
この掲示板の2ページ目、3ページ目のURLが
知りたいんですが、どのページも同じURLなんです・・・・
2ページ目はどうやれば指定できるんでしょうか?
何か元になるURLに付記すればいいのでしょうか?教えてください・・
0057nobodyさん03/12/14 12:53ID:???
ここは正規表現のスレです。
激しくスレ違い >>53 >>55 >>56
0058nobodyさん03/12/14 12:55ID:???
POSTも知らない厨房が紛れ込んだスレはここですか?
0059nobodyさん03/12/14 12:57ID:9SKP9sfi
>>57
>>58
うっせーハゲども
教えれば委員だよおしえれば
シネヤ
0060nobodyさん03/12/14 12:59ID:???
スレ違いだというのに真っ赤な顔をして書き込んでいる厨房がいるスレはここですか?
0061nobodyさん03/12/14 13:01ID:9SKP9sfi
>>60
してねーよ妄想野郎
0062nobodyさん03/12/14 13:02ID:???
正規表現に関係ないのに教える訳にもいかんだろーが…
0063nobodyさん03/12/14 13:05ID:???
しょーがねぇな…

◆HTML講座(Web製作板)
http://pc2.2ch.net/test/read.cgi/hp/1010398268/
0064nobodyさん03/12/14 13:10ID:9SKP9sfi
>>63
そこでおしえてくれ
0065初心者03/12/15 04:53ID:llm//hKN
"@"という文字と"word"のどちらかにヒットする正規表現
が分からないのですが、[@]wordではないし、どうなるのでしょうか。
0066nobodyさん03/12/15 05:33ID:???
>>65
ちみはスレタイも読めないのか?
0067nobodyさん03/12/15 06:14ID:???
正規表現の質問なんだから間違ってはいないだろう。
0068nobodyさん03/12/15 09:03ID:???
67=65
00696803/12/15 09:05ID:???
xorなら話変わるか。
なんで正規表現でやる必要があるのかよく分からんが。
0070nobodyさん03/12/15 10:25ID:8LAW+/sT
>>65
一つの正規表現に拘る必要はないと思うが、、、?
条件分岐だとして例えば
if($key_word=〜/@/ || $key_word=〜/word/){〜以下実行文
では駄目なのかな?
0071nobodyさん03/12/15 10:31ID:???
Read Only Memory : 書き換え不可の記憶媒体。
Read Only Member : 書き込まない利用者。
0072nobodyさん03/12/15 10:59ID:???
>>70
わからないなら書かなくていいから
0073nobodyさん03/12/15 14:28ID:???
>>65
(@|word) とか。
なんでみんなどの言語で実装するか書かないのだろう?
0074nobodyさん03/12/15 14:41ID:???
それはどちらにもヒットする正規表現では。
0075nobodyさん03/12/15 23:09ID:8LAW+/sT
>>75
 70は間違ってはいないよ、不充分かも知れんが。
 そもそも65の質問がどういうシチュエーションでどういう動作の目的でどういうマ
ッチングをさせたいのかを詳細に述べていないという不充分な訊き方なので、70のよ
うな「充分用を足すかどうかは保証の限りではない」当たり障りのない答えが返って
きても当然だと思うが。
 70の記述で取り敢えず「@」「word」が含まれていれば、その含まれている最初
の箇所マッチする。 複数含まれていて、それを全てマッチさせるのか、n回目まで
マッチさせるのかなどでオプション等の補助的記述が必要になって来るし、「含まれ
ている」ではなく「その単語そのもの独立だけに厳密マッチ」させるのならが、また
違う話になってくる、それをイチイチ説明していたら解説書になってしまう、それは
自分で読んでくれってことになる。
0076nobodyさん03/12/16 09:10ID:???
なんだ?こいつ。
0077nobodyさん03/12/16 13:37ID:???
>>76
アホは放置で。
0078nobodyさん03/12/16 16:12ID:???
不十分とか言う以前に正しい記述をしろってーの
0079nobodyさん03/12/16 17:08ID:???
>>78
>>75 は、元の質問が十分じゃないので正しい記述は不可能、と言いたいのだろう。
だが、アホなので放置で。
0080nobodyさん03/12/18 18:53ID:zzUoxnBB
小数点を含まない数値にマッチさせるパターンを教えて下さい。

X25.125
X12.1
X78.
でなく
X25
X789
にマッチさせたいんです。 
御多忙中の所、誠に恐縮では御座いますが、
御教示いただければ幸いです。
0081nobodyさん03/12/18 18:57ID:???
>>80
> X25.125

Xとか入ってるけど,これって数値か?
0082nobodyさん03/12/18 19:01ID:???
>>80
(.+?)\.
0083nobodyさん03/12/18 19:11ID:zzUoxnBB
スミマセン
Xは無視してもらっていいです。
0084nobodyさん03/12/18 19:27ID:???
perlの正規表現なんですが、
$hoge = "a(b(c))";
の時に、$hoge =~ m/(.*)\((.*)\)/
とすると、$1は"a(b"で、$2は"c)"になりました。
つまり文末から見ていることになるのですが、これを
$1は"a"で、$2は"b(c)"になるようにするにはどうすればいいでしょうか。
よろしくお願いします。
0085nobodyさん03/12/18 19:36ID:???
>>84
それは文末から見ているんじゃない。. は ( も含むから
最初の .* が一番長くマッチできるところまで取り込んでいるだけ。

/([^)]*)\((.*)\)/ か /(.*?)\((.*)\)/ かこの辺↓参照。
http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
0086nobodyさん03/12/18 20:29ID:???
>>80は普通に
[0-9]+
じゃない?
全体なら^$つけるとか。
0087nobodyさん03/12/18 20:34ID:???
同意
0088nobodyさん03/12/18 21:08ID:zzUoxnBB
[0-9]+ ですと
例えば
10.
10.01
10
のうち、全ての"10"を拾います。 上記3つの数値のうち小数点を含まない
10(3つ目)のみにマッチさせたいんです。
0089nobodyさん03/12/18 21:11ID:???
>>88 -> >>86
0090nobodyさん03/12/18 21:42ID:???
>>88
>全体なら^$つけるとか。
^[0-9]+$
0091nobodyさん03/12/19 06:15ID:z9mYPuUz
ところが全て行末ではないんです。
0092nobodyさん03/12/19 08:15ID:tSEWBAlW
$perl -pe 's/(?<![\.\d])(X\d+)(?![\.\d])/##$1##/g;' >>80

小数点を含まない数値にマッチさせるパターンを教えて下さい。

X25.125
X12.1
X78.
でなく
##X25##
##X789##
にマッチさせたいんです。 
御多忙中の所、誠に恐縮では御座いますが、
御教示いただければ幸いです。
00933903/12/19 10:20ID:???
今頃ですが・・・
自力で検索したサイトは難しい所ばかりだった気がしたのですが、
>>1のリンク先を一通りち回って、今回は何とかなりました。
たぶん答えるのもアホらしい低レベルな質問だったんでしょうね。
スレ汚し失礼しました。
0094nobodyさん03/12/19 13:04ID:???
>92 いいかげんにしろやカス
0095nobodyさん03/12/19 16:38ID:???
>>92
おらよ。
/(?:^|[^\d\.])(\d+)(?:[^\d\.]|$)/
0096nobodyさん03/12/19 23:48ID:???
/(?:^|[\d\.])([1-9]\d*)(?:[^\d\.]|$)/
0097nobodyさん03/12/21 14:45ID:???
>>92
お前さんのレベルじゃ,
込み入った正規表現に手を出すのはまだ早いんじゃないか?
とりあえずわかりやすい代替手段でも使っておけ。

my $f = 'fs4.5s5d.af56.156asd';
my @res = ();
foreach ( split(/[^\d.]/, $f) ){ push( @res, $_ ) if(/^[\d]+$/); }
if(! scalar(@res) ){ print "no match!\n"; }
elsif( scalar(@res) > 1 ){ print "too much match!\n"; }
else{ print "matched:[$res[0]]\n"; }


0098nobodyさん03/12/21 23:40ID:qD9UdeKR
[サッカー][蹴球]96 ATLANTA OLYMPIC BS1総集編 日本1-0ブラジル 前園 カヌー オルテガ [110m08s DivX5].avi dgju9h3hNw 731,862,992 53de508adb8dc5d557c4d83efde22799
nyのキー情報(↑みたいなの)を正規表現で表すことできますかね?

ダウソ板のスレを全部取り込んで、
キー情報だけ抜き出してリストを作りたいです。
0099nobodyさん03/12/22 00:11ID:???
「みたいの」ってのが無理。
0100a03/12/22 01:56ID:???
>>98
もっとわかりやすく説明しろボケ
0101nobodyさん03/12/22 02:02ID:???
いいから放置しとけ
0102nobodyさん03/12/23 15:26ID:???
YahooXXXX.bbtec.net
からも
xxx.xxxx.ap.so-net.ne.jp
からもプロバイダ名を抽出させる方法を教えてください。
0103nobodyさん03/12/23 18:11ID:???
(\S+\.)?\S+\.[a-zA-Z]{2}[a-zA-Z]{2}
と
(\S+\.)?\S+\.[a-zA-Z]{3}

俺にはこんなものしか思いつかねーよ
0104nobodyさん03/12/23 19:52ID:???
>>102
ASAHIネットは www.ne.jp というホスト名を持っているわけだが、
ここからASAHIネットだと特定できる文字列をどうやって抽出しようかねぇ?

/
  (?:
    ([0-9A-Za-z](?:[\-0-9A-Za-z]*[0-9A-Za-z])?) # 3rd LD
    \.
  )?
  ([0-9A-Za-z](?:[\-0-9A-Za-z]*[0-9A-Za-z])?) # 2nd LD
  \.
  ([A-Za-z](?:[\-0-9A-Za-z]*[0-9A-Za-z])?) # TLD
  \.?$
/x
0105nobodyさん03/12/24 10:46ID:???
>>102
常にドメイン名からプロバイダが抽出できると信じている時点でダメ。
0106nobodyさん03/12/24 14:10ID:???
「ISP名」ではなくて、XXXXX.XXX.XXX.2ch.netの
2ch.netを取得したいと仮定して答えても問題ないかな?
0107nobodyさん03/12/24 18:42ID:???
>>106
とりあえずそれでいってみよー
0108nobodyさん03/12/24 21:51ID:???
>>106
いいっすよ!
0109nobodyさん03/12/25 19:44ID:???
適当に答えてみる。
[-0-9a-zA-Z]+.[-0-9a-zA-Z]+$
多分[-0-9a-zA-Z]じゃ足りないけどよく分からないので。識者よろ
0110nobodyさん03/12/25 19:55ID:???
適当すぎて・・・・・・・・・・・・・
0111nobodyさん03/12/25 20:51ID:???
>>109
<q cite="http://member.nifty.ne.jp/moha/rfc/rfc2396j.txt">
hostname = *( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
</q>
=> >>104
0112nobodyさん03/12/25 21:14ID:???
hogehoge.XXX のように.の後が3文字なら
後ろから二つ目の.まで
hogehoge.ne.XXのように.の後が2文字なら
後ろから三つ目の.まで
.XXXのXがすべて\dならIPアドレスということで全部

とでもしておけばいいんじゃない?適当すぎですが
0113nobodyさん03/12/26 00:26ID:???
>>112
汎用 JP ドメインなんてのもあるがな。
0114nobodyさん03/12/26 01:23ID:???
>>112
適当どころじゃないわな
0115nobodyさん03/12/26 13:51ID:icJ7Wsig
#!/usr/bin/perl
$_ = << "EOD" ;
<test>
<test2>abc</test2>
</test>
<test>
<test2>def</test2>
</test>
EOD
/(<test>.+<\/test>)/s ;
print "$1\n" ;

テキスト中にある<test>文字列</test>を抽出したいと思ってるんだけど、
結果はこうなってしまう。
<test>
<test2>abc</test2>
</test>
<test>
<test2>def</test2>
</test>

結果はこうなって欲しい。
<test>
<test2>abc</test2>
</test>
こんな事も試したけどうまくいかず・・・
/(<test>(?!<test).+<\/test>)/s ;
何方か、お助け。
0116nobodyさん03/12/26 13:56ID:???
>>115
.+?
0117nobodyさん03/12/27 16:00ID:???
〜〜[hoge]〜[foo]〜〜〜[bar]〜〜[moge]〜

のような感じのテキストで[hoge]以外の[と]で囲まれている部分を消して

〜〜[hoge]〜〜〜〜〜〜〜

のようにしたいのですが、hoge以外の場合マッチという方法が思いつきま
せん。[^hoge]で無いことは確かなんですが・・。
文字列の否定の方法をどなたか教えてくださいませ。
0118nobodyさん03/12/27 17:39ID:???
>>117
s/\[(?!hoge)[^\]]*\]//g;
http://www.din.or.jp/~ohzaki/regex.htm
011911703/12/27 17:54ID:???
>>118
どうもです。
0120初心者スレ902,90403/12/29 16:56ID:???
Perl コーディング初心者質問コーナー Part30
http://pc2.2ch.net/test/read.cgi/php/1069846177/902-
こちらから誘導されてきました。
再度質問を書きます

あるスクリプトで

my $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*';
$FORM{'FROM'} =~ s/($check)(?: | )+$/$1/g;

というのがあったのですが、"?:"というのはどういう意味なんでしょうか?
(このスレでも"?:"という表現が使われていますね)

ttp://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html
ここも見てみたのですが、いまいち意味が分かりませんでした。
教えてもらえると助かります。
0121初心者スレ902,90403/12/29 17:03ID:???
わざわざ誘導されてきたのにすみません。自己解決しました。
ttp://www.kt.rim.or.jp/~kbk/regex/regex.html#GROUPING_NOBR
ここを読んだら分かりました。
0122nobodyさん03/12/31 18:09ID:9hwbEMBW
rubyで
/#{str1}/.match(str2)
としたときstr1のメタ文字を通常の文字としてマッチさせたいのですがどうしたらいいですか?
0123nobodyさん04/01/01 00:08ID:???
>>122
Regexp.escape(str1) か Regexp.quote(str1)
0124nobodyさん04/01/01 00:51ID:???
>>123
thx
0125nobodyさん04/01/07 22:03ID:3+H2s8ZL
<dt>[名無し]さん(bin+cue).rar<>sage<>03/12/30 00:57 ID:St9M3KSl<dd>2 <br>
<dt>クソスレみっけ<><>03/12/30 00:57 ID:o9NEl4Ao<dd>じしんないから3で <br>

とあって、空タグの<>間にある文字列を

<dt><a href="mailto:sage">[名無し]さん(bin+cue).rar</a> 03/12/30 00:57 ID:St9M3KSl<dd>2 <br>
<dt><a href="mailto:">クソスレみっけ</a> 03/12/30 00:57 ID:o9NEl4Ao<dd>じしんないから3で <br>

のように<a>に内包させたい場合どうしたらよいでしょうか
テキストエディタは秀丸を使っています
0126nobodyさん04/01/07 22:21ID:???
>>125
置換ダイアログで
検索: <dt>\f[^<]*\f<>\f[^<]*\f<>
置換: \0<a href="mailto:\3">\1</a>
012712504/01/08 00:00ID:???
>>126
どもです、バッチリでした
もすこし勉強してきま
0128nobodyさん04/01/08 11:30ID:A5R/iNdF
PHPでHTMLを埋め込める掲示板スクリプトを作ってますが

<…>となっている不等号はHTMLタグとみなして、そのままにしておき
それ以外のHTMLタグとみなせない不等号を&lt;と&gt;に置き換えて
HTMLタグ内にない”と&をそれぞれ&quot;と&amp;に変換するように
正規表現を書きたいのですが色々書き直して試してますが
思い通りに動作しなくて困ってます。
どのように正規表現を書けばよいか知恵を貸してください。お願いします。

<…>の形になってない不等号を&lt;と&gt;に置き換える作業は今は
以下のようになってます。

$message = @ereg_replace("<(([^>]|\n)*)<", "&lt;\\1&lt;", $message);
$message = @ereg_replace("<(([^>]|\n)*)", "&lt;\\1", $message);
$message = @ereg_replace("(([^<]|\n)*)>", "\\1&gt;", $message);
0129nobodyさん04/01/09 07:37ID:???
>>128
preg使えよ…
0130 ◆MbpwKgPmhw 04/01/13 18:01ID:???
$ENV{'USER_AGENT'}で得られる文字列から、ブラウザ名とバージョンを抜き出す関数を作っています。
正規表現のせの字もわからんような状態から何とかあちこち検索かけてここまで作りました。
しかし、まだ正規表現のありがたみが足りない気がして、不満です。
よければもっと要約できる点、あるいは不備な点の指摘をお願いします。ちなみに、書き込みのためにここでは全角でインデントいます。コピペの際にご留意下さい。
#-----------------------#
# UA一般名化         #-----------------------------------------------------#
#-----------------------#
# 引数は、($ENV{'USER_AGENT'})
sub envUa2uaName{
 my ($UA) = $_[0];
 if($UA =~ /MSIE/){
  $UA =~ s/(.){0,}MSIE ([0-9]{1,}(\.){0,}[0-9]{0,})(.){0,}/InternetExplorer $2/;
 }
 elsif($UA =~ /Opera/){
  $UA =~ s/(.){0,}Opera(.)([0-9]{1,}(\.){0,}[0-9]{0,})(.){0,}/Opera $3/;
 }
 elsif($UA =~ /Safari/){
  $UA =~ s/(.){0,}Safari(.)([0-9]{1,}(\.){0,}[0-9]{0,})(.){0,}/Safari $3/;
 }
 elsif($UA =~ /Netscape/){
  $UA =~ s/(.){0,}Netscape(.)([0-9]{1,}(\.){0,}[0-9]{0,})(.){0,}/Netscape $3/;
 }
 elsif($UA =~ /Firebird/){
  $UA =~ s/(.){0,}Firebird/Firebird/;
 }
 elsif($UA =~ /^Mozilla/){
  $UA =~ s/Mozilla\/([0-9]{1,}(\.){0,}[0-9]{0,})(.){0,}/Mozilla $1/;
 }
 $UA =~ s/([a-z A-Z 0-9]{0,})\/([0-9]{1,}(\.){0,}[0-9]{0,})/$1 $2/g;
 return $UA;
}
0131130 ◆MbpwKgPmhw 04/01/13 18:02ID:???
>>130 =~ s/インデントいます/インデントしています/;
0132nobodyさん04/01/13 18:12ID:???
DoCoMoは?
0133nobodyさん04/01/13 18:53ID:???
>>132

( ゚д゚)ハッ!
そう言えば忘れてました・・・
0134nobodyさん04/01/13 19:00ID:???
j-phoneとvodafoneとauも忘れないでね。
0135130 ◆MbpwKgPmhw 04/01/13 19:03ID:???
>>134
サンプルデータが無い・・・・
UAが分からないと正規表現の書きようがない・・・
0136nobodyさん04/01/13 19:07ID:???
そんなものいくらでもころがってるだろう
0137130 ◆MbpwKgPmhw 04/01/13 19:08ID:???
>>136

スマソ
0138nobodyさん04/01/13 19:46ID:???
ちなみに俺はWin2000&IE6だが、UAはMozilla/5.0 (Macintosh; N; PPC; en-US; m18) Gecko/20000929 Netscape6/6.0b3となってる。
0139130 ◆MbpwKgPmhw 04/01/13 20:13ID:???
>>138

環境変数をイジってる人のまでは対応仕切れないのでそれはそのまま表示します・・・。
0140未承諾広告※ ◆aiY4htt2.2 04/01/13 21:12ID:???
UA なんて偽装し放題なんだからそれからブラウザ名を判定しても何の有り難みもねーよ。

と聞こえてくるのは幻聴でしょうか。。。
0141nobodyさん04/01/13 22:04ID:???
俺にはドリキャスのうめき声が聞こえる。。。
■ このスレッドは過去ログ倉庫に格納されています