正規表現道場@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さん辺りが書いてくれるカモ・・・・
0249名無しさん@お腹いっぱい。
02/01/13 20:08ID:???そんなことないでしょ?
Perlだってhttpd.confだっておけらだってあめんぼだって
みんなみんな生きているんだ。
ていうか、WebProg意外に正規表現使わない人だって結構いますから。
0250(・∀・)!! 1
02/01/13 21:15ID:???いや、それがですね旦那、旦那みたいな方ばっかりなら良いんっすけどね
あっちもアレな人が増えてきたんで、
正規表現 → 氏らねー → Perlじゃネーカ?? → よっしゃ煽ったろ
みたいになって荒れるより、こっちで静かに余生を送りたいなと思ったんすよ
// 試しにたててみます? ^^;;
0251名無しさん@お腹いっぱい。
02/01/13 21:32ID:???試しに立ててみましたみたいな立て方すると、結果が予見できる・・・(笑)
0252(・∀・)!! 1
02/01/13 21:48ID:???普通の人:どの言語でも良いの?、それともオートマトンとかエンジンの話するの?
↓
R**y屋さん:正規表現も積んでない言語は糞!!p**lはもっと糞!!r**y!!!
↓
D**phi屋さん:ハァ??ライブラリ使えば良いだろ?R**y逝ってよし!
↓
R**y屋さん:でるphなんか使うやしはあふふぉf R**y!!!!>>>>>>>D**phi
以下糞スレを増殖しつつ、無限ループ
// 嫌すぎます・・
0253名無しさん@お腹いっぱい。
02/01/13 23:04ID:???いや、Perlでいいじゃんとか。
PHP・・・とか書いて放置されるとか、
漢はshつかえとか、入り乱れてのバトルロワイヤル。
でもないか。
0254248
02/01/14 23:31ID:???スクリプト言語だと特に。
そこまで考えてませんでした。やぼなツッコミしてすみませんです。
0255名無しさん@お腹いっぱい。
02/01/15 01:35ID:/IL06s2P$text = ">>2は逝ってよし!";
$text =~ s/>>[0123456789]{1,3}/<a href="">$&<\/a>/g;
ココまではできたんですが、アンカーのURLに引用もとの数字を入れたいんですが
(この場合だと"2")、それをどう取得したらよいか分かりません。
この正規表現の書き方では無理ですか?
0256名無しさん@お腹いっぱい。
02/01/15 02:47ID:???s#>>(\d+)#<a href="http://pc.2ch.net/test/read.cgi/php/996105815/$1">$1</a>#g;
print;
0257名無しさん@お腹いっぱい。
02/01/15 02:58ID:???s#>>(\d+)#<a href="http://pc.2ch.net/test/read.cgi/php/996105815/$1">$&</a>#g;
print;
0258255@へたれ正規表現
02/01/15 03:03ID:???ありがとうございます。
ここでつまってて、もう文字列解析しようと思ってました(藁
0259名無しさん@お腹いっぱい。
02/01/18 15:45ID:DsGDZg+9「文字Aが含まれる行」は正規表現でどのように書くのでしょうか?
Aが含まれる行を全て削除(又は置換)したいんです。
0260名無しさん@お腹いっぱい。
02/01/18 15:50ID:OQbDLabT@data = <FILE>;
map {
if ($_=~/A/) { $_=''; }
} @data;
seek(FILE, 0, 0);
print FILE @data;
close(FILE);
----------------------------
なんか間違ってたら直して
0262名無しさん@お腹いっぱい。
02/01/18 21:48ID:???0263259
02/01/19 02:06ID:???0264名無しさん@お腹いっぱい。
02/01/22 02:11ID:hOKQ9mVE0265名無しさん@お腹いっぱい。
02/01/31 17:52ID:???メールアドレスの入力チェックなんだけどどーゆー意味?
0266名無しさん@お腹いっぱい。
02/01/31 23:21ID:XvhUBoWrこの<と>に囲まれてない部分の"だけ("寒い"と"暑い")
"に変換するには正規表現でどう書くんでしょうか?
$str =~ s/>(.*?)"(.*?)</>$1"$2/g;
と書くと2個目の"が変換されませんでした。
0267名無しさん@お腹いっぱい。
02/01/31 23:23ID:XvhUBoWr> "に変換するには正規表現でどう書くんでしょうか?
↓
> "に変換するには正規表現でどう書くんでしょうか?
とりあえず気が付いたことだけ。
1. 繰り返し処理``だけ''を行いたいならgrepやmapではなくforeachを使うのがよろし。
2. データの一部が削除されているので、truncateしてやらんと末尾にゴミがくっ付いてしまう。
0269名無しさん@お腹いっぱい。
02/02/01 01:10ID:???$str = '<font size="5">冬は"寒い"。</font>夏は"暑い"。';
こんなのしか考えつかない…。正規表現一発で出来るの?偉い人〜
foreach (split /(<[^>]+>)/,$str) {
!/</ and s/"/"/g;
print;
}
0270266
02/02/02 01:23ID:YNNMuvTzありがとうございます。
そこから考えて、汚いですがとりあえずこんなので解決しました。
while ($str =~ s/>([^<]*)"/>$1"/g or $str =~ s/"([^>]*)</"$1</g) {}
もし正規表現一発で出来る方法があったらよろしくお願いします。
0271初心者
02/02/02 03:29ID:oZiG+SwXじゃだめなのか。
0272名無しさん@お腹いっぱい。
02/02/02 03:58ID:???こんなんしか出来ませんでした。
$str = join '', map { /^</ or s/"/\@/g; $_ } split /(<[^>]*>)/, $str;
$str = join '', map { /^</ or s/"/"/g; $_ } split /(<[^>]*>)/, $str;
0275名無しさん@お腹いっぱい。
02/02/03 19:17ID:???0276名無しさん@お腹いっぱい。
02/02/04 03:27ID:???0277名無しさん@お腹いっぱい。
02/02/04 03:37ID:???それどんなかんじ?
0278あぼーん
NGNG0279名無しさん@お腹いっぱい。
02/02/04 06:14ID:???ぐぐーるしてください。
0280名無しさん@お腹いっぱい。
02/02/04 10:37ID:6Yw0Bfwoこれなんかどうよ?
文脈依存文法表現案
http://www.try-net.or.jp/~yoji/idea/gramagic/codgex.html
まだ案だけど、これが完璧になれば、圧縮ファイル中の html ファイルの
a 要素の href 属性の中で 2ch に関係してるものを検索、
とか出来るようになるのかな。まだ案だけど。
0281名無しさん@お腹いっぱい。
02/02/15 04:54ID:???0282名無しさん@お腹いっぱい。
02/02/15 07:48ID:???0283268
02/02/16 21:03ID:???0284名無しさん@お腹いっぱい。
02/02/28 01:43ID:xJe5pzKX複数スペースを一個にしたいので
$string =~ s/\s+/\s/g;
とやったらうまくいきません。ていうか
$string =~ s/\s/test/g;
とやっても半角スペースに反応しなかったんですけど、\sの理解が間違ってますか?
宜しくお願いします。
0285名無しさん@お腹いっぱい。
02/02/28 01:50ID:???0286名無しさん@お腹いっぱい。
02/02/28 01:52ID:xJe5pzKXちなみにどうして284のは間違ってるんですか?
0287名無しさん@お腹いっぱい。
02/02/28 01:53ID:???2番目のは反応したよ。
\sは[ \t\n\r\f]と同意。
半角スペースだけでなく,タブや改行にもマッチする。
0288名無しさん@お腹いっぱい。
02/02/28 01:58ID:xJe5pzKXもっかいやってみます。ありがとうございました。
0289285
02/02/28 02:14ID:???左側のくくりのパターンには\sのような複数の意味をまとめたエスケープ表現は
使えるが、リプレイス部分に複数の意味を持つエスケープを書いても何に置き換えて
いいものかが曖昧になることを考えるとおのずと使えないということがわかります。
したがって、かくならつぎのようにも書けます。
s/\s+/ /g;
s/\s+/\x20/g;
0290名無しさん@お腹いっぱい。
02/02/28 02:21ID:xJe5pzKXところで、
s/ +/ /g;
これじゃあだめですか。いや、だめだったんですけど..。
0291名無しさん@お腹いっぱい。
02/02/28 02:32ID:???Perl5.004でうまくいったよ。
スレ違いぎみなのでsage
0292285
02/02/28 02:33ID:???できるはずなんですが...
$_= 'a b c';
s/ +/ /g;
print $_,"\n";
0293290
02/02/28 02:49ID:???勉強して出直してきます。ごめんなさい。
0294nobodyさん
02/03/05 21:54ID:X1wZ/GVzオートリンクのa要素のhref属性の値まで省略されたので、
$comment =~ s/(<a (.+)>)?(([\w\.\/\:]){20})([\w\.\/\:]){35,}(<\/a>)?/$1$3 \(省略\)$6/g;
と書いたのですが、今度は適用されるのが最後にマッチしたヤツだけになりました。
最後にgを付けてるのに全てにマッチされないのは何故ですか?
また、この記述より(・∀・)イイ!!のがあればご教授ください。
おながいします。
0295nobodyさん
02/03/06 00:04ID:???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" と分けられるからマッチだ! とかいう難問かとオモタヨ…
これって出来るの?
■ このスレッドは過去ログ倉庫に格納されています