正規表現道場@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さん辺りが書いてくれるカモ・・・・
0202185
01/12/21 03:29ID:???おお、どうもありがとう。
こっちの船渡し問題は昔Cでhash使って、最短手数出るように
解いたんだけど、このスクリプトもちゃんと同じ17手になるんだね。
しかし、見にくいコード・・・。
0203174
01/12/21 06:58ID:???ああ、それたまに欲しくなるよね。
$pattern ="hogehoge";
$dummy =/^${pattern}_[Gg][Ee][Tt]\s*=\s*(.*)/;
while( // ){
...
}
$patterm も case を ignore してほしいのよ。
素直に i つかえばいいんだろうけどさぁ...
0204174
01/12/21 07:00ID:???ああ、ちょっと違う。
$pattern ="[Hh][Oo][Gg][Ee][Hh][Oo][Gg][Ee]";
だった。
んで、$dummy をどうするかって話...
0205JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/21 07:18ID:???何が言いたいのか良く理解できないので、想像して書きます。
$pat = "abc"; のとき、/${pat}de/ で "ABCde" も受理されるようにしたいっ
てこと? それなら/(?i:$pat)de/ とかいう感じで。(The letters between ? and
: act as flags modifiers, see the (?imsx-imsx) manpage.)
繰り返しになるけど、ある正規表現が受理する文字列は無限に存在する可能性
があるので、正規表現 => 受理する文字列を全て見つける は不可能だよ。正
規表現じゃなくて単純なパタンならある程度可能だけどね。
# 単純な例として、// とか /moe/ とかの場合考えると分かると思う。
とりあえず、>>203 は分かりやすい日本語でも書いてろってこった。
0206名無しさん@お腹いっぱい。
01/12/21 08:15ID:???の言ってることは意味不明だけど、>>197は「全て」とはひとことも
書いてない。一つだけでいいんだろ。
とりあえず、JAPUは脳内変換やめろってこった。
>>197
できないことはないだろうけど、正規表現パースして解析して
とかカナーリめんどくさいことになりそう。
0207名無しさん@お腹いっぱい。
01/12/21 08:37ID:???0208名無しさん@お腹いっぱい。
01/12/21 08:53ID:EZ0rO4Ln0209名無しさん
01/12/21 09:32ID:???0210名無しさん@お腹いっぱい。
01/12/21 09:33ID:???学生さんの冬休みの自由研究としてちょうどいい分量かも。
1. 正規表現をparseしてオートマトンを作る。
2. オートマトンからゴールに向かって状態を遷移させていく。(無限ループに注意)
みたいな感じか。
1で作るオートマトンでのNFAとDFAの比較、2で最短の解を求めるアルゴリズム
なんかを考察してみるのも楽しそう。
0211名無しさん@お腹いっぱい。
01/12/21 09:37ID:???perlはあまり使ったことがないので、203さんの言ってることは
ちょっとよくわかんないんですが、
全てヒットする必要はありません。
一個でもヒットする文字列ができればいいんです。
if ($str =~ /\d+/) {
}
とかあったときに、ifが成立するようなstrを生成したいというだけなので、
全ては必要ないですし、長さが最低でなければならないというわけでもありません。
>>206
自分でもいろいろ考えた結果、自分でパースするしかないかと思い
かなりめんどくさそうだったので、もしかしたらなんかいい方法あるかも?
とか思い質問したんですが、やっぱ地道な方法しかありませんか……
0212名無しさん@お腹いっぱい。
01/12/21 09:38ID:???脳内長島用語って脳内長嶋用語のことですか?
0213名無しさん@お腹いっぱい。
01/12/21 12:42ID:???仕様が曖昧すぎるな
もう少し簡単に絞ればいくらでも実現方法はあるだろ
0214名無しさん@お腹いっぱい。
01/12/27 00:04ID:8/UHgYLFhttp://123http://456http://789
↑ 1つのURLに… 笑!
0215名無しさん@お腹いっぱい。
01/12/27 01:29ID:???0216名無しさん@お腹いっぱい。
01/12/27 02:16ID:???よく意味が判らないのですが...
0217名無しさん@お腹いっぱい。
01/12/27 02:24ID:???0218名無しさん@お腹いっぱい。
01/12/27 08:38ID:???0219名無しさん@お腹いっぱい。
01/12/27 19:20ID:???0220わかれ
01/12/28 00:50ID:???http://tmp.2ch.net/test/read.cgi/kitchen/1009247793/
http://1. ??
http://1. ??
http://1. ??
http://1. ??
http://1. ??????
http://1. ??????????
http://1. ??????????????????
http://1. ??????????????????????
http://1. ??????????????????????????
http://1.?????????? ?????? ??????????
http://1.???????? ?? ?? ?? ????????
http://1.???????? ?? ?? ?? ????????
http://1.?????????? ?????? ??????????
http://1.??????????????????????????????
http://1. ??????????????????????????
http://1. ??????????????????
0221test
01/12/28 00:51ID:???http://www. ゝ′ ̄( ∀)
http://www. UU ̄U U
0222名無しさん@お腹いっぱい。
01/12/28 00:58ID:???青くなってないぞ・・・。
0223名無しさん@お腹いっぱい。
01/12/28 01:11ID:???フォームの中では絵になってたよ(w
↓こっちで楽しんでくれ
http://tmp.2ch.net/test/read.cgi/kitchen/1009247793/
0224名無しさん@お腹いっぱい。
01/12/29 02:13ID:???http://www...ゝ′ ̄( ∀)
http://www......UU ̄U U
0225名無しさん@お腹いっぱい。
02/01/05 04:37ID:jzyBr8o20226名無しさん@お腹いっぱい。
02/01/05 05:25ID:???よく意味がわからないなあ。
たとえば"14giko9mona033zonu7:@dd+i100"を、"14","giko","9","mona","033","zonu","7",":@dd+i","100"
に分割したいってこと?
0227名無しさん@お腹いっぱい。
02/01/05 12:22ID:0tAKedaDよくわからんけど、例えの労力に感動。
「ちがいます」の一言で終わりそうだけど。
たとえば・・・てのは、質問者がやらなきゃいけないことでしょう?(笑)
0228225
02/01/06 03:54ID:Ts5foqO9その通りです!
例えば…を書かなくてすみません。お願いします。
0229名無しさん@お腹いっぱい。
02/01/06 04:16ID:???imakara
tukuruyo
mattetene
0230229
02/01/06 04:42ID:???$mozi = join("", @mozi);
@suzi = (0..9);
$suzi = join("", @suzi);
$data = 'abc940ab?!あkcc873ilo';
$naga = length $data;
for (0..$naga) {
$base = substr($data, $_, 1);
if ($mozi=~$base) { $char = 'mozi'; }
elsif ($suzi=~$base) { $char = 'suzi'; }
else { $char = 'hoka'; }
if ($oldchar eq $char) { $form[$#form].=$base; }
else { push(@form, $base); }
$oldchar = $char;
}
print "Content-type: text/html\n\n";
print join("<>", @form);
できた。
0231225
02/01/06 04:49ID:ksFrDwl4ありがとうございます。まずコードを読んで勉強します。
でも、正規表現でもっとスマートにはできないでしょうか?
やはり、これくらいコードを書かなきゃだめですか
0232名無しさん@お腹いっぱい。
02/01/06 05:18ID:???$giko = '14giko9mona033zonu7:@dd+i100';
@kazu = $giko =~ /(\d+|\D+)/g;
$moji .= '"' . join('","' , @kazu) . '"';
print "$moji\n";
0233名無しさん@お腹いっぱい。
02/01/06 05:26ID:???○ $moji =
× $moji .=
0234ダメ男
02/01/06 05:27ID:EPBlOzfD;### これでどうでしょう?
$_= '012abc$%@987ABC/=!';
$SEPA= '^K';
s/(\d)(\D)/$1$SEPA$2/g;
s/(\D)(\d)/$1$SEPA$2/g;
s/(\w)(\W)/$1$SEPA$2/g;
s/(\W)(\w)/$1$SEPA$2/g;
for ( split(/$SEPA+/) ){
print $_,"\n";
}
0235名無しさん@お腹いっぱい。
02/01/06 06:03ID:???$giko = '14giko9mona033zonu7:@dd+i100';
print '"' . join('","' , $giko =~ /\d+|\D+/g) . '"';
0236226
02/01/06 06:52ID:???たとえば数字とそうでないものとに分けて2つの配列に格納したい場合。
my $str = '14giko9mona033zonu7:@dd+i100';
my @num;
my @notnum;
($1) ? push(@num, $1) : push(@notnum, $2) while $str =~ /(\d+)|(\D+)/g;
"033"の先頭の0をこの段階で取り除いて、数値として @num に格納したいのなら、
$1 の箇所は $1 + 0 に変更だね。
0237ダメ男
02/01/06 06:53ID:n1rLEP+p;### 1行で書くと↓のようになります。(ピリオドで連結しないでカンマで区切って出力したほうが処理が速い)
print '"',join('","' , ($giko= '14giko9mona033zonu7:@dd+i100')=~ /\d+|\D+/g),'"';
0238名無しさん@お腹いっぱい。
02/01/06 07:08ID:???それだと、もはや$gikoに意味が無いような…。これと同じ。
print '"',join('","' , '14giko9mona033zonu7:@dd+i100' =~ /\d+|\D+/g),'"';
0240ダメ男
02/01/06 07:34ID:rx7aYtfj$_= 'aa14giko9mona033zonu7:@dd+i100';
$SEPA= "\033";
s/((\d+)|(\D+))/$1$SEPA/g;
for ( split($SEPA) ){
@catch= (@catch, $_); ## または push(@catch, $_);
}
0241ダメ男
02/01/06 07:39ID:GkL31czH;### 不要なカッコを書いていました。
s/((\d+)|(\D+))/$1$SEPA/g;⇒s/(\d+|\D+)/$1$SEPA/g;
0242ダメ男
02/01/06 07:51ID:7uRhBz8jmy $str= '14giko9mona033zonu7:@dd+i100';
push(@catch, $1 ? $1 : $2) while $str=~ /(\d+)|(\D+)/g;
0243名無しさん@お腹いっぱい。
02/01/06 16:36ID:???で一番シンプルな解が出てるのに延々続いてるのはなぜ?
@catch = ( $str =~ /(\d+|\D+)/g );
0244243
02/01/06 16:37ID:???@catch = ( $str =~ /\d+|\D+/g );
0245225,231
02/01/07 03:24ID:9HzJI0rFいろいろな書き方があるのでとても勉強になりました
たくさんの方々、本当にありがとうございます^^
0246名無しさん@お腹いっぱい。
02/01/09 01:40ID:Guhk8J3C0247名無しさん@お腹いっぱい。
02/01/11 16:12ID:???0248名無しさん@お腹いっぱい。
02/01/13 14:15ID:???なぜプログラム板にスレを立てなかったか問い詰めたい。
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氏の方法で上手くいきました。
教えられた関数等について調べてみます。
ホントにありがとうございました!
■ このスレッドは過去ログ倉庫に格納されています