トップページphp
986コメント301KB

正規表現道場@2ch

■ このスレッドは過去ログ倉庫に格納されています
0001ヽ(´▽`)ノ2001/07/26(木) 09:03ID:???
以外と毛嫌いして居る人も多そうな正規表現、
でもperlを使いのなす上で避けて通れない道だったりするかもです。
そこで、スクラップブック的に目に止まったカッコイイ正規表現を
書き留めておこうと言うスレッドです。
質問する時は言語と、得たい結果をなるべく詳しく書いてね。

取り合えず僕が知ってる有用なリンクです。
http://www.din.or.jp/~ohzaki/perl.htm
http://www.kt.rim.or.jp/~kbk/regex/regex.html

もっとイイ(・∀・) リンクは>>2-10さん辺りが書いてくれるカモ・・・・
0341 02/04/24 07:10ID:AP/UWkPc
>>337
♥のような実体参照はaにはならずaheartsaになる。
0342 02/04/24 07:11ID:AP/UWkPc
340は間違えた。
0343nobodyさん02/04/24 15:36ID:???
>>340
実体参照でなく絵文字のようなコードは。
CGIぽん
ttp://specters.net/cgipon/labo/it_emoji.html
0344nobodyさん02/04/24 18:26ID:???
部分文字列としてabとbaを同じ数だけ含むような文字列にマッチする正規表現を教えてください。
0345nobodyさん02/04/24 20:08ID:???
「abとbaを同じ数だけ含むような文字列」とやらを教えてください。
0346nobodyさん02/04/25 06:16ID:???
abaとかabaaaabaaです。
0347nobodyさん02/04/25 07:50ID:???
>>346
my $str = 'abaaaabaa';
my (@ab, @ba);
print 'Matched' if (@ab = $str =~ /ab/g) == (@ba = $str =~ /ba/g);

"aba" みたいにマッチ箇所がオーバーラップしていても良いのなら上のやつで.
正規表現一発でいけるのなら漏れも知りたい.

マッチ箇所のオーバーラップが許されていなくて
"ababab" でも "ab a ba b" と分けられるからマッチだ! とかいう難問かとオモタヨ…
0348nobodyさん02/05/02 00:59ID:ErHIGJRy
>>347
> マッチ箇所のオーバーラップが許されていなくて
> "ababab" でも "ab a ba b" と分けられるからマッチだ! とかいう難問かとオモタヨ…

これって出来るの?
0349nobodyさん02/05/03 01:20ID:???
オレにはパターンマッチ・置換を正規表現でできなかったためしがない。
なんでもオレに聞きやがれ。適切な答えをはじき出してオマエに叩きつけて
やるゼ!

きっ、きまったぁ!
0350nobodyさん02/05/03 11:30ID:6+RS1vf9
ばーkぁいl7いl7いl7いl7いl7い
l7いl7いl7いl7いl7いl7いl7kyそpr
@いhw45えsっyyyyyyyyybhんtrs5じゅhじゅ
hじゅhじゅhじゅhじゅhじゅhじゅhじゅhじゅhじゅhじゅh
ゅhじゅhじゅy234rthじゅrthjrstw45hjhjt5
hjt5346
コテハンは死ね!
0351nobodyさん02/05/09 06:02ID:???
すいません、perl で URL の表記を区切って使用したいのですが、
正規表現の理解が浅く、まだ上手くできません。
存在しないサービスや、表記の規則違反はあとで考えるとして、
どのようなパターンで取り出せば良いものでしょうか。

my $rule = '([a-z]+)://([^:/@]*):?([^@:/]*)@?([\d\w._\-]*):?(\d*)([\d\w._/\-]*)\??([\w\d%=+&]*)';
my $url = 'http://user:pass@host.net:21/path/?key=value&query';
my ($service, $user, $pass, $host, $port, $path, $query) = $url =~ m/$rule/;

このままですと http://host.net/path/ のような user@pass が
全く省かれた場合に、前に詰まってしまいました。
読み難い上に無駄な指定も多いのですが、何方かご教授願えませんか?
0352nobodyさん02/05/09 20:53ID:???
>>351
他にも問題は山積しているんだけど、取り敢えず ? がどこまで有効なのか考えよう。
(〜)@? → (〜@)? とか。
0353nobodyさん02/05/09 21:37ID:???
>>352
有難う御座います。() の後に ? を置けるのは初めて知りました。
マッチするのは直前の単なる一文字ではなく、一パターンだったのですか。

# http URL の正規表現
# http://www.din.or.jp/~ohzaki/perl.htm#httpURL
ココを参考にしながら精進する事にします。
035453102/05/09 21:57ID:???
御陰様でなんとか出来たような感じです。

(?:([a-z]+)://)?       # Service
(?:([^:/@]*)?:?([^@:/]*)?@)? # ID:PASS
([\d\w._\-]*)         # Host
(?::(\d*))?          # Port
(?:([\d\w~._/%\-]*))?     # Path
(?:\??([\w\d%=+&]*))?     # Query

よく考えると皆さんが正規表現に凝ってらっしゃるのは
エラー (汚染) チェックも兼ね備えているからなんですかね。
私も早く安心して任せられるようになりたいです。
0355nobodyさん02/05/09 22:31ID:???
>>354
頑張ってなー。あと、質問する時はなるべくageてなー。
0356351=353=35402/05/09 23:50ID:???
>>355 ハイです (*´ー`*)
035735102/05/10 23:19ID:???
>>354 自己レスですが、\w を [A-Za-z] だと勘違いしてました (汗
0358nobodyさん02/05/15 23:13ID:???
特定の文字列以降の文字を消すのはどうやるのですか?
厨質問ですみませんです。
0359nobodyさん02/05/16 00:44ID:???
>>358
$_ = 'Look-behindで文章中の特定文字列以降の文字を消すよ.';
s/(?<=特定文字列).*//s;

Perl 5.005 以前のバージョンならこっちで.
s/(特定文字列).*/$1/s;
0360nobodyさん02/05/16 01:26ID:???
>>359
どうも、ありがとうございます。
やってみます。
0361nobodyさん02/05/26 06:41ID:65ctyZPu
タグの中からパスを取り出そうとしているのですが
$str = "<a href=\"./hoge/hoge.html\"><img src=\"./hoge.jpg\"></a>";
if($str =~ /<a href="(.*?\.jpg)">/i){print $1."\n";}
とすると、何も出力されないはずなのに
./hoge/hoge.html"><img src="./hoge.jpg
と出力されてしまいます。どうすればよいのでしょうか?
0362nobodyさん02/05/26 07:59ID:???
>何も出力されないはずなのに
いや、.*?なら出力されると思うよ。(<a href="になってるのは間違い?)
./hoge.jpgが欲しいなら /<img src="([^"]+\.jpg)">/に変えてみれば?
0363nobodyさん02/05/26 08:22ID:65ctyZPu
>>362
いや、./hoge.jpgが欲しいんじゃなくて
aタグの""の中身にはマッチしないから何も出力しないようにしたいのですが。
(もちろんhtmlとかにすると出力されるようにはしたい)
0364nobodyさん02/05/26 23:36ID:???
>>361
/<a href="([^"'>]*?\.jpg)">/i

[^]の使い方でも勉強すればぁ?(゚Д゚)
0365nobodyさん02/05/27 00:50ID:???
HTML::LinkExtorを使うのが正しいかと。
0366nobodyさん02/05/27 02:58ID:???
>>364
すいません。>>362の解答を応用してなんとかできした。
0367nobody02/06/24 01:33ID:???
すんません、
http://pc.2ch.net/test/read.cgi/php/1011460833/24
これお願いします
0368nobodyさん02/06/24 03:27ID:???
m{<a\s+[^>]*href=["]?((?:http://)?[-_.!~*'()a-zA-Z0-9;/?:\@&=+\$,%#]+)["]?[^>]*>([^<]+)</a>}i
0369nobodyさん02/06/24 03:39ID:???
>>367
Perlでド適当に書くとこんな感じ.

my ($href, $title);
while ($str =~ m{<a\s+(?:href\s*=\s*(["'])(.+?)\1|.)+?>(.+?)</a>}gis) {
    ($href, $title) = ($2, $3);
    $href or next;
    print  "href: $href\ntitle: $3\n\n";
}
0370nobodyさん02/06/24 03:53ID:???
>>369
細かいけど、*(["'])(.+?)\1 の部分、
(.+?)だと空白入りません?
037136702/06/24 04:33ID:???
>>368-370
ありがとうございます。
参考にして
$u="dsffds<a target=\"_self\" href=\"http://www.age.sage/\" name=\"lewraw\">age</a>aaa";
$pt="<a.*href=\"?(http://.[^\"[:space:]>]*).*>(.*)</a>";
if(ereg($pt,$u,$a))print_r($a);
みたいにしてみたらうまくいきました。
Array
(
[0] => <a target="_self" href="http://www.age.sage/" name="lewraw">age</a>
[1] => http://www.age.sage/
[2] => age
)
なんか問題があったら指摘よろしくです。
0372nobodyさん02/06/24 04:58ID:???
>>370
うん,空白どころか何でも入るよ.だからド適当なの.許して.
0373nobodyさん02/06/28 00:21ID:J53QbdCk
名前にtaroかjiroが含まれてたら云々、、ってので、
(taro|jiro)って書いたら動きませんでした。アホですか?
0374nobodyさん02/06/28 00:45ID:???
>>373
それしか情報を出さずに意図が伝わると思ってるならアホだな。
0375nobodyさん02/06/28 01:31ID:J53QbdCk
それしか、、と言われればそれしかなんですが、これ以上書いても意味ないかなと。。
一応書いておくと、PHPで、
ereg((taro|jiro),$name)
と書いてあります。アホですか?
0376nobodyさん02/06/28 03:26ID:???
>>373
アホだな。
コードはもちろん言語も書いてない。
どういうデータをマッチ対象にしてるのかも書いてない。
373の質問で答えが出ると本気で考えている?
それだけの状態で「taroかjiroにマッチさせるならそれでいいはずです。」
としか答えられないぞ。

ereg( 'taro|jiro', $name)
PHPは良く知らないけどその>>375のコードでエラー無く動くの?
0377nobodyさん02/06/28 20:10ID:QMNhJJyt
上のコードだとエラーは起きないけどマッチしてくれません。
正規表現苦手でして、、すいません、、
0378nobodyさん02/06/29 03:23ID:???
PHP スレで聞けば?

俺、PHP全然解らないから、 ereg 関数の第1パラメーターが
正規表現もオッケーなのか解らないから答えようがない…
0379nobodyさん02/06/30 14:39ID:ZCEQ9KmT
$hoge = tr/hoge//d;
こういう場合に、「hoge」に完全にマッチした場合のみ削除するにはどうすればいいのですか?
0380&r02/06/30 14:41ID:???
$hoge=~ s/hoge//g;
0381 02/06/30 14:47ID:5Ce/MloT
「100から150までの数字をチェックするには、"[#100:150]"」
これはProxomitronのヘルプにあったんですが、Perlでこれをやるにはどうすればいいのでしょうか?
0382 02/06/30 14:50ID:???
あっ 1[0-5][0-9]という事ではなくて、
[38-523]のような・・・
0383&r02/06/30 14:57ID:???
この場合は正規表現を使う必要はなくて、演算子を使います。

100 <= $hoge && $hoge <= 150;

これが真を返すか偽を返すかです。
0384nobodyさん02/06/30 15:00ID:???
>>380
ありがとうですた
038538202/06/30 15:05ID:???
うーん なるほど。
0386ororo02/06/30 19:03ID:iJPZXMQB
****************
/root
/hoge
/root/hoge
/root/some/hoge
****************

で、/rootと/hogeだけ取り出すのって
どーやったらよいんでしょうか?

/*だと、/も含まれちゃうんで。

/がでて、その後に/以外の文字列が続くものを
検出したいんですけど。

[^/]とか使う感じのイメージはあるんですが。
0387ororo02/06/30 19:16ID:???
あ、/が二回でてこないのでもいいかもです。
0388&r02/06/30 19:28ID:???
>387
@set= qw(/root /hoge /root/hoge /root/some/hoge);

for ( @set ){
    /^(\/[^\/]+)/ && print $1,"\n";
}
0389nobodyさん02/06/30 19:45ID:???
386の別解。388のほうが効率よさげだけど。
@set= qw(/root /hoge /root/hoge /root/some/hoge);
@selected = grep { /^\/[^\/]+$/ } @set;
0390&r02/06/30 19:49ID:???
>389
末尾一致させないので $ が要らない罠
0391&r02/06/30 19:50ID:???
>389
マッチ部分の取り出しができていない罠
0392&r02/06/30 19:52ID:???
>389
書くんなら
@selected = map { /^(\/[^\/]+)/ ? $1 : () } @set;
0393&r02/06/30 20:06ID:???
あーっ、ひょっとしてわたしが勘違い?
よく読んだらリストの上2つを取り出すってことか。

てっきり勘違いして /root および /hoge ディレクトリを含むパス
のリストを抜き出すのかと思ってた。
0394ororo02/06/30 22:56ID:???
>393

>389の方の答えが望んでた答えっす。

ありがとうございますた。
0395nobodyさん02/07/01 01:29ID:???
>>389
ねね? qw って何?

>>390-393 ウザイ。氏ね
0396nobodyさん02/07/01 01:44ID:???
>>395
ここで聞く前に調べろクズ!
0397nobodyさん02/07/01 05:32ID:???
>>389
@selected = grep m{^/[^/]+$}, @set;

せめてこれくらいの可読性は確保しよう。
grepにブロックを使うのは、どうしても必要な時だけにした方が
いいかもしれない。
0398nobodyさん02/07/01 15:54ID:???
>>396 ネタニマジレス(・∀・)カコイイ!!
0399nobodyさん02/07/02 00:42ID:icSYdM+A

title>url って文字列があったとき、
title と url を切り分ける処理をするとします。
ただし、> と < と & と " あたりは &..; に置き換えられてるから
実際は title>;url を処理することに。

で、問題はバックスラッシュによるエスケープを導入するとき
どうしたらいいのかなんですが...

title\>;hoge>;url -> ( title\>;, url )

^(?:((?:\\.|.)+?)>;)?(.*)$

で出来なくてお手上げです。
どうしたらいいんでしょう…
0400nobodyさん02/07/02 00:55ID:???
>399
質問もまともに書けないのか?
0401nobodyさん02/07/02 00:59ID:???
>>399
意味不明
0402nobodyさん02/07/02 01:01ID:???
>>399
病気か?
0403nobodyさん02/07/02 01:55ID:???
>>399
あらてのアラシか?
0404nobodyさん02/07/03 15:23ID:kdrdWrUq
>399-403
ジサクジエンデシタ
0405ahaaann02/07/03 17:36ID:eJO6ovYm
ahaann
0406nobodyさん02/07/04 19:37ID:hx78UF1Q
教えて下さい
 ログイン名をsageで登録しようとすると、すでに登録されていて
あと、sage1、sage34が登録可能です。みたいに、するにはどうすれば
宜しいのでしょうか?
お願い致します。
0407nobodyさん02/07/04 19:45ID:???
>>406
データベースをつかうかファイルにデータ保存してもっておくかすればいいじゃん。
0408nobodyさん02/07/04 19:47ID:???
>>406
あるかどうか調べて、あったらランダムに数字を付け足した文字を出せばいいんじゃない?
0409nobodyさん02/07/08 15:23ID:3WwYz0B2
/((19(0[48]|[2468][048]|[13579][26])|20([02468][048]|[13579][26]))\/02\/29|(19|20)\d{2}\/((04|06|11)\/(0[1-9]|[12]\d|3[0])|(0[13578]|10|12)\/(0[1-9]|[12]\d|3[01])|(02\/(0[1-9]|1\d|2[0-8]))))/
YYYY/MM/DD 形式で、1900年から2099年まで処理可能な日付チェック。
0410nobodyさん02/07/08 15:38ID:???
わざわざ、正規表現で行う必要あるのかと…(略
0411nobodyさん02/07/08 22:10ID:Hy1uHDxp
たとえば、
1.$rei = abc?def?ghi? というのと、
2.$rei = abc?def?ghi というのがあるとして、

?が最後につくかつかないかを判別する方法って
なにかありますか?
それで、2の場合、
$rei = abc?def?ghi を
$rei = abc?def? と、最後のghiをカットする
のも知りたいです。

やってみたのは、
1.$rei =~ s/(\?)(ghi)(\?)(jklm)$/$1$2$3/g;
2.$rei =~ s/(\?)(ghi)(\?)(jklm)(\?)$/$1$2$3$4$5/g;
でした。
(ghi) や (jklm) のところを正規表現したいんですが、
何をあててやればいいんですか?
\w{0,} とかやってみたんですが、うまくいかなくて。
0412nobodyさん02/07/08 22:27ID:???
 if( /\?$/ )

 s/^(.*)\?(.+)$/$1\?/;
0413nobodyさん02/07/08 23:00ID:???
>>410
それはプログラム技術板で半年くらい前に見たやつだ。半ばネタとして作られたものだが、
要件は満たしている。

・・・・・・・・・・・遅いけど。
0414nobodyさん02/07/08 23:02ID:tPkNiwTi
> 412
やってみます
0415>>40902/07/10 17:12ID:???
m!\d{4}/\d{2}/\d{2}!;
($year, $month, $day) = ($1, $2, $3);
next unless (($year >= 1900) and ($year <= 2099) and ($month > 0) and ($month <= 12) and ($day > 0) and ($day <= 31))

ま、>>409 はネタだと思うが。
0416nobodyさん02/07/10 23:27ID:PCSWC5jP
HTTP::Request関数を使うとき、メソッドがPOSTの場合、

my $req = new HTTP::Request POST => $URL;
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');

って書いたけど、GETの場合は、

my $req = HTTP::Request->;new(GET => $URL;

だけでよい?
0417 02/07/11 00:28ID:???
<BODY background="aaa.jpg" bgcolor="#000000">
ってあった場合""の中身だけ取り出すのはどうしたらいいでしょうか?
(つまりこの場合、aaa.jpgと#000000)
0418nobodyさん02/07/11 00:39ID:???
>>417
/"\w"/g;
0419 ◆K1SiC5MI 02/07/11 01:38ID:???
>>417
/"([^"]+)"/g;
042041702/07/11 02:41ID:???
どもです。/"\w+"/g で出来ました
0421nobodyさん02/07/11 10:43ID:???
>>420
\wには.と#が含まれんが本当にできたのか?
042241802/07/12 00:05ID:???
>>421
昨日書き込みしたあとから思ってた。
(あーこれ#とかはいらねーからだめだわ。でも書き直すのめんどくさいしいいか。)
0423nobodyさん02/07/12 08:54ID:UFWs6b8F
/(^-^)/
0424nobodyさん02/07/13 01:14ID:???
s/>>423//;
0425nobodyさん02/07/14 00:00ID:???
s/424の人生//g;
0426 02/07/14 01:01ID:???
s/425の将来/鬱/g;
0427nobodyさん02/07/14 05:32ID:???
$2ch =~ s/2ch/3ch/g;
0428nobodyさん02/07/14 12:17ID:???
s/>>428/俺/g;
0429nobodyさん02/07/14 15:59ID:???
$here =~s/^.*$/削除依頼/s;
0430性器初心者02/07/15 14:17ID:5LzaPgx6
すんません。正規表現わかんないですー。
半角英数文字のパスワードのチェックをかけたくて,言語PHPなんですが。。。

echo ereg('([a-zA-Z0-9_])',"123=$");

結果は1と返ってきます。FALSEと評価してほしいのですが?
どなたかご指導くださいな。
0431コギャル&中高生02/07/15 16:38ID:VlVzBsms
http://www1.ocn.ne.jp/~kado77/mimi/

お役立ちリンク集
必ず役立ちます

コギャルとH出来るサイトはここ
ヌキヌキ部屋へ直行便

http://kado7.ug.to/wowo/
0432nobodyさん02/07/15 21:45ID:???
なんか最近、アクセス数を荒稼ぎするためにスレ違いのURLアドレスを
リンクさせてるヤシが目につくから、そのサーバ自体をDOSるのもこれ
たのし!
0433ぽよぽようんこ02/07/15 22:30ID:uZYoW+tQ
しつもんさせてちょ。
perl使ってます。
if ($line !~ /\w{3,12}/) {&error;}
ってやってます。僕的には英数3〜12文字じゃなかったらエラーって意味のつもり
なのですがうまく行きません。下限は有効なんですが、上限12文字超えても
エラーが出ないんです。どこかおかしなところありますか?宜しくお願いします。
0434nobodyさん02/07/15 22:32ID:???
if ($line !~ /^\w{3,12}$/) {&error;}
先頭から行末までがないだろうが。
0435ぽよぽようんこ02/07/15 22:38ID:???
!!なんと!!
僕は1年以上もマッチングというものの使い方を間違えていました!
なぜ今までうまく行っていたんだろう。
取り合えず、どうもありがとうございました。大変助かりました。
0436nobodyさん02/07/15 22:46ID:???
>>433
文字列の中に埋もれてる連続英数字数を判定したいなら最短マッチで。
if ($line !~ /\w{3,12}?/) {&error;}
0437ぽよぽようんこ02/07/15 23:06ID:???
>>436
アフォでつか? レベルが低過ぎるね!
0438436じゃないよ02/07/15 23:27ID:???
感じわる〜
0439ぽよぽようんこ(本物)02/07/16 00:00ID:???
>>437 こらこら。人のステハン拾うな。
>>436 ありがとうございます。ていうか?って半年くらい使ってないから何なのか忘れちったよ。
とステハンの名誉を守ったり。何やってんだ俺。
0440ぽよぽようんこ(本物)02/07/16 00:06ID:???
以上、自作自演でしたー。
■ このスレッドは過去ログ倉庫に格納されています