正規表現道場@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さん辺りが書いてくれるカモ・・・・
0182ぴこ
01/12/14 03:34ID:LSCy87gyおぉお〜出来ました感動です!
かなり不安でしたが2chに書き込みしてみてよかったです。
自分の勉強不足が身にしみました
ただ、全角スペースが||で囲まれている理由が
全く分らないのでCGI&Perlポケットリファレンスを
片手に、がばってみます。
このような質問に丁寧に答えていただき
真に有難う御座いました。
0183JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/14 03:56ID:???$piko =~ s/^[.\n\s ]*//g;
これは、ソースコードが Shift_JIS で書かれている場合、
$piko =~ s/^[.\n\s\x81\x40]*//g;
と等価になります。
で、さらに言うと、
* (いわゆる) 全角スペースは Shift_JIS で "\x81\x40" です。
* Perlでは原則的に文字列をバイト単位で扱います。
* "?" は Shift_JIS で "\x81\x48" です。
頑張ってください。
あと、このままだと先頭の "." まで削除しちゃいます。
# 文字クラス [...] 中では多くのメタ文字はそのメタ性を失うため。
----
あと、本は少し高いけど「プログラミングPerl改訂版」が良いと思います。(
中身はperldoc に全部載っていますが、本の形態である方が最初のうちは何か
と便利です。)
0184174
01/12/14 13:56ID:eAyIvKrjやりたいことってのは、
普通の文章の中にあらわれる (...) を切取るって作業なんです。
でも、普通の文章の場合、(...) の中に単体で '(' とか ')' が出ることもあるか...
諦めます。
0185名無しさん@お腹いっぱい。
01/12/18 00:11ID:lPs5lnwvあるってどこかで見て一度見てみたいんだけどgoogleで調べても出てこない。
だれか、コード or コードを載せてあるページ知ってる人いない?
恥ずかしながら、どうやって解いているのか見当もつかない。
0186名無しさん@お腹いっぱい。
01/12/18 00:31ID:???0187名無しさん@お腹いっぱい。
01/12/18 00:39ID:???人食い族と宣教師がボートに乗って川を渡る
とかいうやつじゃないの?
0188名無しさん@お腹いっぱい。
01/12/18 01:14ID:???スマン。
問題書いてなかったね。
3 人の宣教師と 3 人の人喰い土人が川の左岸にいます.
1 隻の 2 人乗りボートを使って,
右岸に渡るにはどうすれば良いでしょうか?
ただし土人の人数が宣教師の人数よりも多くなると,
宣教師は喰われてしまいます
という問題。
0189名無しさん@お腹いっぱい。
01/12/18 01:52ID:???0190名無しさん@お腹いっぱい。
01/12/18 02:36ID:???でプログラム技術板で解いてたとか。(18,52あたり)
ちょっと違う問題っぽいけど。
肝心のムの板スレは見つからず・・・
0191190
01/12/18 02:41ID:???0192名無しさん@お腹いっぱい。
01/12/19 00:58ID:???おもしろそうだから探してみたけど見つからなかった (-v-;
正規表現のコンパイラを上手く使って分岐するのかな?
と言うかこの問題ニ分木で解いたけど難しかった。。。
0193名無しさん@お腹いっぱい。
01/12/19 19:57ID:iZmRvdOPまとめようと思いました。IEのバージョンとwinのバージョン以外は無視するつもりで
/MSIE.*5\.5.*Windows.*98/
とやっても
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
などにマッチしてくれません。正規表現道場の師範の方々にご教授願いにあがりました。
環境はActivePerl(perl5.6.1 built for MSWin32-x86-multi-thread) on Windows2000proです。
一応分け方としてはMSIE5.01, 5.0, 5.5, 6.0とWindows 95, 98 ,NT5の組み合わせを
考えています。
#それにしてもヴァージョン違いの多さにあきれてしまいます。そういえばMeがでてきません。
#98の3rdエディションともでていなかったけど
0194名無しさん@お腹いっぱい。
01/12/19 20:11ID:1HBNd19Z最短は何手なの?
自分も解いてみたけど13手だった。
0195JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/19 20:56ID:???マッチしますが?
0196名無しさん@お腹いっぱい。
01/12/19 21:53ID:FzZSVld0コーディングの問題でした。
処理が下に抜けていた。
修行し直します。
0197名無しさん@お腹いっぱい。
01/12/20 17:08ID:???例えば、/\d+/とかだったら、0、/\d+\w+/だったら、0aとか。
0198JAPU@ハーマイオニー萌え ◆JAPUTeX.
01/12/20 18:04ID:???0199名無しさん@お腹いっぱい。
01/12/20 23:34ID:???0200名無しさん@お腹いっぱい。
01/12/20 23:46ID:dNXMf8EIちょっと違うけど。
問題クレクレ
http://piza.2ch.net/tech/kako/989/989687023.html
船渡し問題
http://piza.2ch.net/tech/kako/990/990503990.html
スクリプト
$_='i=FMBBGGSD;@n=(F,M,B,G,S,D);Yp{_X!(/D/&!/S/&/[^D]/|/F/&/G/&!/M/|/M/&/B/&!
/F/)}Yz{_X!_|/[FMS]/}Yr{aXbXp(a)&p(b)&p(a.b)&z(b)}Yt{my(@o,c,d,e,f,g,h,i,j);c=k
%2;e=iXf=jXif(c&!f){push@m,join"\n",@l,k,"";return}_=e;y/FB/MG/;return if Z&Z<=
k;Z=k+1;@o=(@n,"");for g(@n){shift@o;for h(@o){e=i;d=g.h;f=j.d;next if e!~s/g//
|h&e!~s/h//|!r(e,d);a="e->d j";a="j d<-e"if c;push@l,a;k++;t(f,e);k--;pop@l;}
}}t i;print@m,@m+0';s/X/=shift;/g;s/Y/sub /g;s|Z|\${c}{join"",sort split//}|g;s
/[|&]/$&$&/g;s/\b[_-k]\b/\$$&/g;eval
0201名無しさん@お腹いっぱい。
01/12/21 02:38ID:???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:???■ このスレッドは過去ログ倉庫に格納されています