正規表現道場@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さん辺りが書いてくれるカモ・・・・
0296nobodyさん
02/03/06 00:18ID:???なっ、なるほどぉ。
勉強になりました。
0297294
02/03/06 00:42ID:???0300nobodyさん
02/03/06 05:25ID:???一応できたよ.a要素だけに限らずタグの内側の文字列はいじらないようにしてみた.
つうか思いッきり>>273-274をパクッてます(w.制限は単純に5文字.
$comment = join '',
map { /^</ or s/([:\.\/\w]{5})[:\.\/\w]+/$1(省略)/go; $_ }
split /(<[^>]*>)/, $comment;
ついでにファイルから読み込みつつ変換するスクリプトも用意してみたよ.
my ($char, $tail) = (q{[:./\w]}, '');
open IN, "./in.html" or die;
open OUT, ">./out.html" or die;
while (my $comment = <IN>) {
my @tmp = split /(<[^>]*?>)/, $tail . $comment;
$tail = ($tmp[-1] =~ /^<.*>$/ ? '' : pop @tmp);
$comment = join '', map { /^</ or s/($char{5})$char+/$1(省略)/go; $_ } @tmp;
print OUT $comment;
}
close IN;
close OUT;
↓こんなふうにタグが複数行にわたって記述されていた場合を考慮してます.
<a
href="http://hoge.hoge.hoge/"
accesskey="h"
title="ほげ〜">
0301294
02/03/06 06:52ID:???みなさん、ありがとうございます。
300氏の方法で上手くいきました。
教えられた関数等について調べてみます。
ホントにありがとうございました!
0303nobodyさん
02/03/08 15:38ID:2kUcWket0305294
02/03/08 21:21ID:???( ´Д⊂ヽ ウエーン
0306
02/03/27 11:31ID:zMki/eSS0307nobodyさん
02/04/08 22:52ID:qnubSkpk0308nobodyさん
02/04/10 00:54ID:???ってどういう意味なんですか、おしえてください。
0310nobodyさん
02/04/10 02:11ID:???print $a;
} elsif ($b == 0) {
print "●";
} else {
print "◯";
}
0311nobodyさん
02/04/10 02:22ID:???単に三項演算子の結果を印字してるだけのこと。
>309
なんでここで die が出てくるんだ? あたまの弱い人か?
>310
認識違いもはなはだしい。はなしにならない。価値のない人間か?
0312nobodyさん
02/04/10 02:49ID:???お前から見て、価値のない人が世の中には多いけど、
それはお前自身の価値が高すぎるからじゃなくて、
お前の価値が、社会の常識とかけ離れているからなんだよ。
0313nobodyさん
02/04/10 05:25ID:???print '●'
}else{
print '○'
}
print ($a || $b == 0) ? "●" : "◯";
こう書くと誤解がないかも
309は「or dieの応用編だ」といっているわけで
0315nobodyさん
02/04/10 12:27ID:???print open IO, $a || $b ? "ok" : "not ok";
これを "or dieの応用編かつperl4仕様だ。"といわれりゃ、そりゃ"ハァ?"だろ。
open(IO, $a) || print("not ok");
これならそう言えないこともないが。
0316nobodyさん
02/04/10 14:29ID:???たしかにそうだよね。
or die ってのを応用したものが ($a || $b == 0) ってのは矛盾してるよね。
ってことは、309は 「(print $a) || ($b == 0 ? "●" : "◯");」だと
勘違いしていたのでは?
つまり311の言うあたまの弱い人ってのは図星かも...
0317nobodyさん
02/04/10 14:47ID:???0318nobodyさん
02/04/10 15:46ID:???0319nobodyさん
02/04/11 16:42ID:9/X5PbzJ0320nobodyさん
02/04/11 19:02ID:???0321ぷうすけ
02/04/11 22:56ID:KLtv0nPl0323nobodyさん
02/04/20 18:04ID:wIgJDzczひらがなだけを、抽出したいのだが
頭が悪いのでよく分からん、教えてくれ。
テキストファイルの入出力は置いておいて。こんな感じの事が行いたいのだ。
$str = "頭が悪い";
$str = ~/[あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん]/;
print $str,"\n";
頭が悪いのでこのように書いたのだが、実行すると
「頭が悪い」
になってしまうのだ、
本当は
「がい」
を求めたいのだができん。
わしより頭の良い、2チャンネラー達宜しく頼む。
0325nobodyさん
02/04/20 20:04ID:???# SHIFT_JIS用
my $str = "書き込みえらー出そうだね。";
print $str =~ /\x82[\x9F-\xF1]/g;
0326nobodyさん
02/04/20 20:32ID:wIgJDzczすまんが、EUCの時はどうするかついでに教えてくれくれぬか。
頼む。
0328nobodyさん
02/04/20 21:14ID:wIgJDzczジョークのセンスも真似たかったが、
頭が悪いので、今宵そこまで気が回らぬ
ありがたく承ったぞ。
my $str = "書き込みえらー出そうだね。";
print $str =~ /\xA4[\xA1-\xF3]/g;
0329nobodyさん
02/04/24 00:23ID:IbG6vdJY0330nobodyさん
02/04/24 00:36ID:aRrtBceI$val = $text
$val =~ s/[A-Za-z0-9]/a/g;
0331nobodyさん
02/04/24 00:42ID:IbG6vdJY0332nobodyさん
02/04/24 00:44ID:IbG6vdJY$val=~s/[^A-Za-z0-9]/a/g;でいいのでしょうか。
0333nobodyさん
02/04/24 00:49ID:aRrtBceIまた、エスケープシーケンス使ってこんなのでもOK。
$val=~s/\W/a/g;
0334nobodyさん
02/04/24 00:57ID:IbG6vdJY0337nobodyさん
02/04/24 02:20ID:gV/ea89mこれってタブとか文字コードやスペースも変換してくれるのでしょうか。
0338nobodyさん
02/04/24 02:30ID:???0339nobodyさん
02/04/24 04:44ID:???0340
02/04/24 07:09ID:AP/UWkPc♥のような実体参照はaにはならず&aaaaaa;になる。
0341
02/04/24 07:10ID:AP/UWkPc♥のような実体参照はaにはならずaheartsaになる。
0342
02/04/24 07:11ID:AP/UWkPc0343nobodyさん
02/04/24 15:36ID:???実体参照でなく絵文字のようなコードは。
CGIぽん
ttp://specters.net/cgipon/labo/it_emoji.html
0344nobodyさん
02/04/24 18:26ID:???0345nobodyさん
02/04/24 20:08ID:???0346nobodyさん
02/04/25 06:16ID:???0347nobodyさん
02/04/25 07:50ID:???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> マッチ箇所のオーバーラップが許されていなくて
> "ababab" でも "ab a ba b" と分けられるからマッチだ! とかいう難問かとオモタヨ…
これって出来るの?
0349nobodyさん
02/05/03 01:20ID:???なんでもオレに聞きやがれ。適切な答えをはじき出してオマエに叩きつけて
やるゼ!
きっ、きまったぁ!
0350nobodyさん
02/05/03 11:30ID:6+RS1vf9l7い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:???正規表現の理解が浅く、まだ上手くできません。
存在しないサービスや、表記の規則違反はあとで考えるとして、
どのようなパターンで取り出せば良いものでしょうか。
my $rule = '([a-z]+)://([^:/@]*):?([^@:/]*)@?([\d\w._\-]*):?(\d*)([\d\w._/\-]*)\??([\w\d%=+&]*)';
my $url = 'http://user:[email protected]:21/path/?key=value&query';
my ($service, $user, $pass, $host, $port, $path, $query) = $url =~ m/$rule/;
このままですと http://host.net/path/ のような user@pass が
全く省かれた場合に、前に詰まってしまいました。
読み難い上に無駄な指定も多いのですが、何方かご教授願えませんか?
0353nobodyさん
02/05/09 21:37ID:???有難う御座います。() の後に ? を置けるのは初めて知りました。
マッチするのは直前の単なる一文字ではなく、一パターンだったのですか。
# http URL の正規表現
# http://www.din.or.jp/~ohzaki/perl.htm#httpURL
ココを参考にしながら精進する事にします。
0354531
02/05/09 21:57ID:???(?:([a-z]+)://)? # Service
(?:([^:/@]*)?:?([^@:/]*)?@)? # ID:PASS
([\d\w._\-]*) # Host
(?::(\d*))? # Port
(?:([\d\w~._/%\-]*))? # Path
(?:\??([\w\d%=+&]*))? # Query
よく考えると皆さんが正規表現に凝ってらっしゃるのは
エラー (汚染) チェックも兼ね備えているからなんですかね。
私も早く安心して任せられるようになりたいです。
0356351=353=354
02/05/09 23:50ID:???0358nobodyさん
02/05/15 23:13ID:???厨質問ですみませんです。
0359nobodyさん
02/05/16 00:44ID:???$_ = 'Look-behindで文章中の特定文字列以降の文字を消すよ.';
s/(?<=特定文字列).*//s;
Perl 5.005 以前のバージョンならこっちで.
s/(特定文字列).*/$1/s;
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いや、./hoge.jpgが欲しいんじゃなくて
aタグの""の中身にはマッチしないから何も出力しないようにしたいのですが。
(もちろんhtmlとかにすると出力されるようにはしたい)
0365nobodyさん
02/05/27 00:50ID:???0367nobody
02/06/24 01:33ID:???http://pc.2ch.net/test/read.cgi/php/1011460833/24
これお願いします
0368nobodyさん
02/06/24 03:27ID:???0369nobodyさん
02/06/24 03:39ID:???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";
}
0371367
02/06/24 04:33ID:???ありがとうございます。
参考にして
$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
)
なんか問題があったら指摘よろしくです。
0373nobodyさん
02/06/28 00:21ID:J53QbdCk(taro|jiro)って書いたら動きませんでした。アホですか?
0375nobodyさん
02/06/28 01:31ID:J53QbdCk一応書いておくと、PHPで、
ereg((taro|jiro),$name)
と書いてあります。アホですか?
0376nobodyさん
02/06/28 03:26ID:???アホだな。
コードはもちろん言語も書いてない。
どういうデータをマッチ対象にしてるのかも書いてない。
373の質問で答えが出ると本気で考えている?
それだけの状態で「taroかjiroにマッチさせるならそれでいいはずです。」
としか答えられないぞ。
ereg( 'taro|jiro', $name)
PHPは良く知らないけどその>>375のコードでエラー無く動くの?
0377nobodyさん
02/06/28 20:10ID:QMNhJJyt正規表現苦手でして、、すいません、、
0378nobodyさん
02/06/29 03:23ID:???俺、PHP全然解らないから、 ereg 関数の第1パラメーターが
正規表現もオッケーなのか解らないから答えようがない…
0379nobodyさん
02/06/30 14:39ID:ZCEQ9KmTこういう場合に、「hoge」に完全にマッチした場合のみ削除するにはどうすればいいのですか?
0380&r
02/06/30 14:41ID:???0381
02/06/30 14:47ID:5Ce/MloTこれはProxomitronのヘルプにあったんですが、Perlでこれをやるにはどうすればいいのでしょうか?
0383&r
02/06/30 14:57ID:???100 <= $hoge && $hoge <= 150;
これが真を返すか偽を返すかです。
0385382
02/06/30 15:05ID:???0386ororo
02/06/30 19:03ID:iJPZXMQB/root
/hoge
/root/hoge
/root/some/hoge
****************
で、/rootと/hogeだけ取り出すのって
どーやったらよいんでしょうか?
/*だと、/も含まれちゃうんで。
/がでて、その後に/以外の文字列が続くものを
検出したいんですけど。
[^/]とか使う感じのイメージはあるんですが。
0387ororo
02/06/30 19:16ID:???0388&r
02/06/30 19:28ID:???@set= qw(/root /hoge /root/hoge /root/some/hoge);
for ( @set ){
/^(\/[^\/]+)/ && print $1,"\n";
}
0389nobodyさん
02/06/30 19:45ID:???@set= qw(/root /hoge /root/hoge /root/some/hoge);
@selected = grep { /^\/[^\/]+$/ } @set;
0390&r
02/06/30 19:49ID:???末尾一致させないので $ が要らない罠
0391&r
02/06/30 19:50ID:???マッチ部分の取り出しができていない罠
0392&r
02/06/30 19:52ID:???書くんなら
@selected = map { /^(\/[^\/]+)/ ? $1 : () } @set;
0393&r
02/06/30 20:06ID:???よく読んだらリストの上2つを取り出すってことか。
てっきり勘違いして /root および /hoge ディレクトリを含むパス
のリストを抜き出すのかと思ってた。
0394ororo
02/06/30 22:56ID:???>389の方の答えが望んでた答えっす。
ありがとうございますた。
■ このスレッドは過去ログ倉庫に格納されています