正規表現道場@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さん辺りが書いてくれるカモ・・・・
0429nobodyさん
02/07/14 15:59ID:???0430性器初心者
02/07/15 14:17ID:5LzaPgx6半角英数文字のパスワードのチェックをかけたくて,言語PHPなんですが。。。
echo ereg('([a-zA-Z0-9_])',"123=$");
結果は1と返ってきます。FALSEと評価してほしいのですが?
どなたかご指導くださいな。
0431コギャル&中高生
02/07/15 16:38ID:VlVzBsmsお役立ちリンク集
必ず役立ちます
コギャルとH出来るサイトはここ
ヌキヌキ部屋へ直行便
↓
http://kado7.ug.to/wowo/
0432nobodyさん
02/07/15 21:45ID:???リンクさせてるヤシが目につくから、そのサーバ自体をDOSるのもこれ
たのし!
0433ぽよぽようんこ
02/07/15 22:30ID:uZYoW+tQperl使ってます。
if ($line !~ /\w{3,12}/) {&error;}
ってやってます。僕的には英数3〜12文字じゃなかったらエラーって意味のつもり
なのですがうまく行きません。下限は有効なんですが、上限12文字超えても
エラーが出ないんです。どこかおかしなところありますか?宜しくお願いします。
0434nobodyさん
02/07/15 22:32ID:???先頭から行末までがないだろうが。
0435ぽよぽようんこ
02/07/15 22:38ID:???僕は1年以上もマッチングというものの使い方を間違えていました!
なぜ今までうまく行っていたんだろう。
取り合えず、どうもありがとうございました。大変助かりました。
0436nobodyさん
02/07/15 22:46ID:???文字列の中に埋もれてる連続英数字数を判定したいなら最短マッチで。
if ($line !~ /\w{3,12}?/) {&error;}
0438436じゃないよ
02/07/15 23:27ID:???0439ぽよぽようんこ(本物)
02/07/16 00:00ID:???>>436 ありがとうございます。ていうか?って半年くらい使ってないから何なのか忘れちったよ。
とステハンの名誉を守ったり。何やってんだ俺。
0440ぽよぽようんこ(本物)
02/07/16 00:06ID:???0441nobodyさん
02/07/16 14:04ID:FumLlavC素人的発想で
$data2 =~ s|<BR>|kaigyo|ig;
$data2 =~ s|<A(.*?)>|ri$1nk|ig;
$data2 =~ s|</A>|rinktoji|ig;
$data2 =~ s|http:(.*?)<BR>|jido$1rin|ig;
$data2 =~ s|<(.*?)>||g;
$data2 =~ s|kaigyo|<BR>|ig;
$data2 =~ s|ri(.*?)nk|<A$1>|ig;
$data2 =~ s|rinktoji|</A>|ig;
$data2 =~ s|jido(.*?)rin|<A HREF="http:$1">http:$1</A><BR>|ig;
とかやってみたけど駄目でした…
0443素人
02/07/16 23:10ID:???こんなのしか書けない。しかも合ってるか分からない。
$data2 =~ s/<(A|\/A|BR)/<>$1/ig;
$data2 =~ s/<[^>]+>//g;
$data2 =~ s/<>(A|\/A|BR)/<$1/ig;
一発でやるの教えてください。
0444nobodyさん
02/07/16 23:26ID:???0445ぽよぽようんこ(本物)
02/07/16 23:52ID:???s/<(?:(?!BR|\/?A[^>]*).)*>//g;
0447素人
02/07/17 00:03ID:???でも全然意味が分からない。
0449nobodyさん
02/07/17 22:13ID:???[[と]]の間に囲まれていないabcを置き換えしたいのです。
[[zzzabczzz]]や[[zzzabc]]や[[abczzz]]や[[abc]]にマッチさせず、
[zzzabczzz]やzzzabczzzなどのabcの部分を置き換えたいのです。
助けてください。
0450nobodyさん
02/07/17 22:31ID:???0451nobodyさん
02/07/18 00:01ID:???0453nobodyさん
02/07/18 19:16ID:???$dataの中に、id=とurl=とname=が含まれていて、なおかつ=が3個含まれていたら
真の値を返すようにしたいのですがどうやるのでしょうか?
(($data =~ /id= && url= && name=/) && ($data =~ /={3}/)) || exit;
0454453
02/07/18 19:25ID:???id=とurl=とname=が含まれていて、なおかつ&が2個含まれていたらの場合です。
0455nobodyさん
02/07/18 22:43ID:pCMKii71$_ = $data;
(/id=/ and /=url/ and /name=/ and (tr/&// == 2))
でいい気が。
0459nobodyさん
02/07/19 13:27ID:SM5AMgkw但し、URLの中に「AaA」又は「BaB」という文字列があるならば、
リンクさせない方法はどうすればいいのでしょうか。
http://aaa.bbb.ccc/ddd/ee.ffAaA
http://aBaBaa.bbb.ccc/ddd/ee.ff
$mes=~s/http:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http:\/\/\:$2\" target=\"_blank\">http:\/\/\:$2<\/a>/ig;
0460nobodyさん
02/07/19 13:56ID:???0461nobodyさん
02/07/19 14:04ID:???大文字にマッチさせたくないんだったら、
\wをa-z0-9、iを削除でいいんじゃないの?
どうでもいいけど、エスケープしすぎ。
0462nobodyさん
02/07/19 14:07ID:???0463nobodyさん
02/07/19 14:55ID:???0464nobodyさん
02/07/19 15:37ID:???とりあえず "<" で始まり, こちらが指定(a, em, dl, etc...)したもの以外の文字列(font, blink, hogehoge, etc...)があったら, というカンジで.
0465nobodyさん
02/07/19 15:39ID:???0467nobodyさん
02/07/20 07:10ID:???0468間違えた
02/07/20 07:14ID:???0471.&rlo;正規表現は簡単ね&lro;
02/07/20 17:15ID:???>>466>>469が正規表現わかってないという根拠は?
少なくとも>>468のようなとんちんかんな正規表現を見ての意見だと思うが…。
0472あぼーん
NGNG0473薄らキリストが見える
02/07/20 19:06ID:???http://eclat.gaiax.com/home/rx72watanabe
マターリ観察中。。。。。 盛り上って来たら一気に攻撃をしかけろ!!!!
35 ::02/07/20 18:45 ID:???
http://isweb44.infoseek.co.jp/family/kmk25y/km-aa.swf
http://isweb44.infoseek.co.jp/family/kmk25y/km-aa2.swf
http://isweb44.infoseek.co.jp/family/kmk25y/km-aa3.swf
http://isweb44.infoseek.co.jp/family/kmk25y/km-aa4.swf
http://isweb44.infoseek.co.jp/family/kmk25y/klist1.swf
http://isweb44.infoseek.co.jp/family/kmk25y/klist2.swf
0474nobodyさん
02/07/20 22:23ID:???もっと適切な日本語使ってくれよ
0475nobodyさん
02/07/21 16:35ID:???言語処理関係の勉強すれば正規表現ってのは
自然な訳だと思えるようになるよ。
0476nobodyさん
02/07/22 00:29ID:???正規 表現
これを自然な訳と思えるあなたとは日本語で話したくありません
0478nobodyさん
02/07/22 20:20ID:???で、2つの | はどういう役割をしているのでしょうか?
0479nobodyさん
02/07/22 20:42ID:???$c =~ /[^A-Za-z0-9;/&?:@=+$,\-_.!~*'()%]/
でもいいし
$c =~ m{[^A-Za-z0-9;/&?:@=+$,\-_.!~*'()%]}
でも何でもいいよ。
0480nobodyさん
02/07/22 20:42ID:???0481479
02/07/22 20:51ID:???はだめでした。
$c =~ /[^A-Za-z0-9;\/&?:@=+$,\-_.!~*'()%]/
です。
デリミタは普通 / を使います。この場合先頭の m は省略できますが、
中身のパターンに / が含まれる場合は \/ というようにエスケープしないといけません。
それを避けるためにデリミタを / 以外のもの | に変えているのです。
0483nobodyさん
02/07/23 02:19ID:XF1QbVW30484nobodyさん
02/07/23 04:14ID:8Y4x0Hwt54<br>354<br>54<Br>43<br>';
の時、例えば
6個目の<br>から先を削除する方法ってわかります?
理想結果はこんな感じです。
$result = '1<br>23<Br>3<br>45<br><br>666<br>';
0485nobodyさん
02/07/23 04:36ID:???最後の<br>が入んないけど、まぁこんなのどうでしょう。
my $data = ...;
my $foo = join( "<br>", (split( /<br>/i, $data))[0..5] );
0486484
02/07/23 04:58ID:???0488nobodyさん
02/07/25 17:43ID:???0490nobodyさん
02/07/25 18:09ID:???s/っぱいだ/ない/;
0491nobodyさん
02/07/25 19:52ID:???0492491
02/07/25 19:53ID:???0493nobodyたん
02/07/25 20:26ID:???0494_
02/07/28 16:28ID:/dbFo95oどうもうまくいきません。
(A)B
B(A)
(C)B(A)
(A)B(C)
B(C)(A)
A
いずれもAを切り出したくて、
if ($foo =~ /(\(([^\(]+)\))+$/) {
$foo = $2;
};
とかやってみたのだけど、なんか変です。
簡単に記述できそうな気がするのだけど……。
0495nobodyさん
02/07/28 17:24ID:???とあるのに
>(A)B(C)
においてもAを切り出したいって意味わからん。
0496nobodyさん
02/07/28 17:25ID:???chomp;
my $rev = reverse $_;
$rev =~ m/^.*?\)(.*?)\(/ and print "[$_]--$1", "\n";
}
__DATA__
(A)B
B(A)
(C)B(A)
(A)B(C)
B(C)(A)
A
0498494
02/07/28 18:13ID:???あああ、それ無し無し。恥ずかしい間違いでした。
>>496
ありがとうございます。
なるほど、いっぺんreverseするんですね。
どこかで使えそうな手なので、覚えておきます。
0500nobodyさん
02/07/28 18:55ID:???0502500
02/07/28 19:03ID:???はは
0508nobodyさん
02/07/29 08:19ID:???my @values = qw[(A)B B(A) (C)B(A) B(C)(A) A B(C(A)DEF BC(D(A)))E) BC(A)(D B)C(D(AAA)(E(FG BC(A)()];
for my $value (@values) {
my @hits = $value =~ /\(([^\(\)]*)\)/g;
print "$value = ",$hits[$#hits],"\n";
}
(A)B = A
B(A) = A
(C)B(A) = A
B(C)(A) = A
A =
B(C(A)DEF = A
BC(D(A)))E) = A
BC(A)(D = A
B)C(D(AAA)(E(FG = AAA
BC(A)() =
…こういう感じであってますか?
0509494
02/07/29 12:19ID:???とりあえず()を全部マッチさせてリストにいれておくわけですね。
なるほど。思ったより簡単にできるものですね。
効率とか速度とかいわれると、よく分からないけれど……。
0510nobodyさん
02/07/29 19:35ID:???必要以上にパターン試すから、
メモリも多く使うし、速度もわるいよ、、、。
0511nobodyさん
02/07/29 23:05ID:MEr3AvIiメールのsubjectなんかで、たとえばこんなのがあったとします。
[ABCDE:0110]ああ〜〜
他のパターンとして、
[ABCDE:]いい〜〜
というのもあるとします。まれに、
Re:[ABCDE:0110]うう〜〜
なんてのもあるとします。
これの数字部分“0110”を取得したいのですがうまくいきません。
$subject=~s/.*\[.*:(\d*)\].*/$1/;
なんてやったら$subject == "" になってしまいます。
いまは仕方なく、
($dummy,$subject)=split(/\[/,$subject);
($subject,$dummy)=split(/\]/,$subject);
($dummy,$subject)=split(/\:/,$subject);
なんてひどいコードですが・・・
どうも、.*ってのを使った瞬間全部がそれにマッチしてしまう気がします。
やはり正規表現でエレガントに行ってみたいのですが、どんな感じになるのでしょう?
0512nobodyさん
02/07/29 23:22ID:???0514age
02/07/31 10:46ID:p4UQxNW6●●件中 ●●- ●●件目 検索にかかった時間●●秒
の行から特定の単語を切り出す正規表現を作っています。
例えば、
re = /日本語のページから(.*)を検索しました。/
re2 = /(\d+)件中(\d+) - (\d+)件目/
re3 = /検索にかかった時間(\d\.\d\d)秒/
のように3つの正規表現に分けて生成するとマッチします。
しかし、
re = /日本語のページから(.*)を検索しました。\s\s約?(\d+)件中(\d+) - (\d+)件目・・?検索にかかった時間(\d\.\d\d)秒/
のようにまとめるといくら頑張ってもマッチしません。
使用言語はrubyですが、
日本語の正規表現ってあまり長くならない方がいいのでしょうか?
0515nobodyさん
02/07/31 10:47ID:p4UQxNW6●●件中 ●●- ●●件目 検索にかかった時間●●秒
の行から特定の単語を切り出す正規表現を作っています。
例えば、
re = /日本語のページから(.*)を検索しました。/
re2 = /(\d+)件中(\d+) - (\d+)件目/
re3 = /検索にかかった時間(\d\.\d\d)秒/
のように3つの正規表現に分けて生成するとマッチします。
しかし、
re = /日本語のページから(.*)を検索しました。\s\s約?(\d+)件中(\d+) - (\d+)件目・・?検索にかかった時間(\d\.\d\d)秒/
のようにまとめるといくら頑張ってもマッチしません。
使用言語はrubyですが、
日本語の正規表現ってあまり長くならない方がいいのでしょうか?
0516mage
02/07/31 10:53ID:p4UQxNW6出来ますか?
できるかどうかが知りたいです。
0519515
02/07/31 12:30ID:???--------------------------------
!/usr/bin/env ruby
keyword_file = ARGV.shift
suffix_file = ARGV.shift
# 正規表現生成
re = /日本語のページから(.*)を検索しました。/
re2 = /(\d+)件中(\d+) - (\d+)件目/
re3 = /検索にかかった時間(\d\.\d\d)秒/
File.foreach(keyword_file) do |kw|
File.foreach(suffix_file) do |sf|
w3m = IO.popen("w3m -dump 'http://www.google.com/search?ie=euc-jp&oe=euc-jp&hl=ja&meta=lr=lang_ja&num=10&q=#{kw}+#{sf}'","r")
pat=/件中/
w3m.each_line do |line|
if pat =~ line
re.match(line)
key = $1
re2.match(line)
cnt,from,to = $1,$2,$3
re3.match(line)
second = $1
printf("%16s %10s => %5d件 %10s 秒 \n",kw.chop,sf.chop,cnt,second)
end
end
w3m.close
end
end
------------------------
だとOKですが、
正規表現を一つにするとだめっぽいのです。
0520515
02/07/31 12:38ID:???w3mでパイプしている奴を
Net::HTTPで高速化させたいですが、正規表現で
引っかかります。
なお、ほしい部分の周辺は
以下のようなHTMLです。
----------------
<table width=100% border=0 cellpa dding=1 cellspacing=0 bgcolor=#3366cc><tr><td bgcolor=#3366cc nowrap><font size=-1 color=#ffffff>
<b>日本語</b>のページから<b>hoge</b>を検索しました。 </font></td>
<td bgcolor=#3366cc align=right nowrap>
<font size=-1 color=#ffffff>約<b>37,500</b>件中<b>1</b> - <b>10</b>件目 ・検索にかかった時間<b>0.54</b>秒</font></td></tr></table>
-------------------------------------
#!/usr/bin/env ruby
require 'net/http'
host = 'www.google.co.jp'
path = '/search?num=10&lr=lang_ja&q=hoge'
http = Net::HTTP.new(host)
page=http.get(path)[1].delete("\n")
print page.scan(%r|ffffff><b>日本語.*秒</font>|i)[0].gsub(%r|<.*?>|,'')
-------------------------------------
rubyのscanの使い方が違うのかな?
もう少し、勉強してきます。
0521”管理”人042
02/08/03 02:59ID:???とのマルチポストです。
速やかに回線を切って首を吊って下さい。
0522nobodyさん
02/08/05 17:55ID:???0523nobodyさん
02/08/12 04:22ID:???0524nobodyさん
02/08/16 21:56ID:???というのはどうすればいいんでしょう?
0526nobodyたん
02/08/19 12:47ID:???0527nobodyさん
02/08/20 11:47ID:???0003水着
0005スイカ
0002花火
・
・
・
というデータが入った配列があって
これをGrepで
0003以上(0003水着 0005スイカ)のデータを
抽出したいのですが
どのように記述してよいのかわかりません。
>= とか <= とかは正規表現では使えないですよね?
全件ループしてIF文で抽出してもよいのですが
Grepの方が速い?と思い質問させていただきました。お助け下さい。
0528nobodyさん
02/08/20 11:55ID:???■ このスレッドは過去ログ倉庫に格納されています