正規表現道場@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さん辺りが書いてくれるカモ・・・・
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:???0529528
02/08/20 12:00ID:???@result= grep($_ ge '0003', <DATA>);
0530nobodyさん
02/08/20 17:19ID:???おぅ!!!!!完璧です!!!感謝!!!!
わかると簡単だけど、最高に感謝です!!
あなたに幸がある事を祈ります!!!
本当にありがとうございました。<(..)>
0531nobodyさん
02/08/26 16:09ID:???$b =(?=.*犬)(?=.*柴):
ループ開始
if ($a ~ /$b/){処理}
ループ終了
ある配列をループさせて $a にその値を入れて
数千回ループさせて検索しているのですが
ものすごく遅いです。
やりたい事は $aの文字列に ある文字(複数)があるかを高速に
検索したいです
もっと高速に検索する方法はないでしょうか。
ちなみに $b の部分は検索条件が何個でも対応できるようにしたいです。
どなたかお願いします、、、
0533nobodyさん
02/08/27 09:53ID:???index連呼ですか?
すいません。どのような意味なのでしょうか。。。
条件の数だけループして普通通り検索すると言うことでしょうか。
0534533
02/08/27 09:58ID:???文字列検索の index(STR,SUBSTR) ですね。
やはり単純にそれがよいのでしょうか。
index連呼で検索するのと
=~ // 連呼で検索するのは理論上はどちらが早いのでしょうか。
0535nobodyさん
02/08/27 11:17ID:C50HKFyhまず試せば?
$a = 'sadfasfj犬okewrworwa';#含まれない
$aa = 'sadf柴asfj犬okewrworwa';#含まれる
use Benchmark;
timethese(300000,{
1=>q{if ($a =~ /(?=.*犬)(?=.*柴)/){$c = 0;}},
2=>q{if ($aa =~ /(?=.*犬)(?=.*柴)/){$c = 0;}},
3=>q{if(index($a,'犬') >= 0 && index($a,'柴') >= 0){$c = 0;}},
4=>q{if(index($aa,'犬') >= 0 && index($aa,'柴') >= 0){$c = 0;}}
});
#Benchmark: timing 300000 iterations of 1, 2, 3, 4...
#1: 13 wallclock secs (12.53 usr + 0.00 sys = 12.53 CPU) @ 23944.45/s (n=300000)
#2: 2 wallclock secs ( 2.60 usr + 0.00 sys = 2.60 CPU) @ 115251.63/s (n=300000)
#3: 1 wallclock secs ( 0.51 usr + 0.00 sys = 0.51 CPU) @ 588235.29/s (n=300000)
#4: 0 wallclock secs ( 0.97 usr + 0.00 sys = 0.97 CPU) @ 308959.84/s (n=300000)
0536nobodyさん
02/08/27 11:36ID:kyy6coMT超悪徳会社 J−COM(ジェイコム)の定期点検を大儀名文とした
勧誘営業に困っていませんか?
点検と言いつつ何もせず、結局はインターネット等の契約をして欲しい
の話へもっていく腐れ外道集団。
断ると「テレビの映りが悪くなっても知らんぞ」と脅迫メッセージをぶつけてくる。
苦情は総務省へ直接電話をすること。
マスコミはケーブルTVとは仲がいいので、テレビで取り上げることはまず無い。
2ちゃんねるパワーでジェイコムを追い詰めよう!!
0537優香
02/08/27 18:39ID:UTh7HsUoelsif ($email !~ /[\w\.\-\&]+\@[\w\.\-\&]+\.[\w\.\-\&]/){&error("メールアドレスが間違っています。");}
0538nobodyたん
02/08/27 20:01ID:???0539呼んだ?
02/08/27 20:03ID:???\\ノハ)ヽ)∩
(○) ´∀`ノ丿 / ̄ ̄ ̄ ̄
⊂二 y / < マルチですー。
/ _二⊃ \____
⊂二ノ
0540nobodyさん
02/08/27 21:39ID:WUqkZoDpまるちぃ〜ん
0541はにゃーん☆
02/08/28 19:01ID:???From: xxxxx@xxxxxxx.xxx
上記のどちらの時でもメールアドレスだけを抜き出す方法を教えてください。
また、メールのヘッダー内の「From:」や「To:」は
これ以外の形で送られるときはありますでしょうか?
例えば
From: <xxxxx@xxxxxxx.xxx> =?ISO-2022-JP?B?xxxxxxxxxxxxx=?=
の様になっていることなど...
どのような形でも確実に(無理で有ればほぼ確実に)抜き出す方法を教えてください。
よろしくお願いします。
色々と試していたのですが
/^From: .*?([\w\+\-\.]+@[\w\+\-]+\.[\w\+\.\-]+).*$/
これで思い通りに抜けるのですが問題有りますでしょうか?
0542はにゃーん☆
02/08/28 19:15ID:???下記のようでよいのでしょうか?
$mail_regex =
q{(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\\} .
q{\[\]\000-\037\x80-\xff])|"[^\\\\\x80-\xff\n\015"]*(?:\\\\[^\x80-\xff][} .
q{^\\\\\x80-\xff\n\015"]*)*")(?:\.(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x} .
q{80-\xff]+(?![^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff])|"[^\\\\\x80-} .
q{\xff\n\015"]*(?:\\\\[^\x80-\xff][^\\\\\x80-\xff\n\015"]*)*"))*@(?:[^(} .
q{\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\\\[\]\0} .
q{00-\037\x80-\xff])|\[(?:[^\\\\\x80-\xff\n\015\[\]]|\\\\[^\x80-\xff])*} .
q{\])(?:\.(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,} .
q{;:".\\\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\\\x80-\xff\n\015\[\]]|\\\\[} .
q{^\x80-\xff])*\]))*};
$hoge = 'From: =?ISO-2022-JP?B?xxxxxxxxxxxxx=?= <xxxxx@xxxxxxx.xxx>';
$hoge =~ s/^From: .*?($mail_regex).*$/$mail=$1/e;
0543nobodyさん
02/08/28 21:22ID:???多少削れる部分があると思いますが、特に問題は無い様に思います。
>>542
質問内容が解りませんが。
正規表現道場ですから、マッタりと待てば誰かが解析してくれるかも知れません。
0546困ったヤシ
02/08/29 14:55ID:???すいませんが…
正規表現で困っています
『file "〜』か『FILE "〜』っていう
キーワードで検索したいんですけど
おながいしますた
0548困ったヤシ
02/08/29 15:01ID:???訂正と補足します。
grepで
from や FROM の次に半角の空白と"以外の
列を探したいのです
/[^from "]|[^FROM "]/;
では無理っぽいですた
0550困ったヤシ
02/08/29 15:12ID:???早速のレスはありがたや
なのですが…
from が form になってます…
出来ませんでした。
補足します秀丸でのgrepです
0551困ったヤシ
02/08/29 15:38ID:???でもだめれす…
お助けを
0552nobodyさん
02/08/29 15:46ID:???っつーか、VIM使えよ
0553困ったヤシ
02/08/29 15:47ID:???0554困ったヤシ
02/08/29 16:00ID:???fileとかformとかfromとか…とりあえず言ってる意味がよくわからないので
どういうパターンなのか他人に分かるように説明してもらわないと
あと、秀丸のヘルプくらい読んでね
0556困ったヤシ
02/08/29 16:38ID:???fromとハンカクの空白とダブルクォーテーション以外の文字のキーワード
冷)from う
冷)FROM あ
なんかにひっかかってほしいんでしゅ
どうですかぁ?お客さん
0557nobodyさん
02/08/29 16:48ID:???すいませんが…
正規表現で困っています
『困ったヤシ』を削除したいんですけど
s/『困ったヤシ』*?$//g;
では無理っぽいですた
0558名無しさん@Meadow
02/08/29 17:12ID:???[from|FROM] [^"]
0559名無しさん@Meadow
02/08/29 17:19ID:r4ScsmNZs/『困ったヤシ』//g;
*?$って書くと、行末の『困ったヤシ』にしか対応線。
0562困ったヤシ
02/08/29 17:56ID:???(from |FROM )[^"]
で逝きますた
0564560
02/08/29 18:21ID:???( ´,_ゝ`) プッ
てやつやめてくれませんか。お願いします。
間違いがあるなら指摘しテク浅い。
0565nobodyさん
02/08/29 18:24ID:???0566nobodyさん
02/08/29 18:31ID:???0567困ったヤシ
02/08/29 18:32ID:???揉めごとはぁ。
(´Д`)ハァハァ
0568困ったヤシ
02/08/29 18:45ID:???0569nobodyさん
02/08/29 18:47ID:???0570いらすま
02/08/30 21:33ID:kfTl+oQS男性器→ おちんちん
女性器→ おまんこ
0571nobodyさん
02/08/30 22:21ID:???0572nobodyさん
02/08/30 22:29ID:???英数字と;/?:@&=+$,-_.!~*'()] だと思うのですが、検索しても
見つかりませんでしたので・・・
0573nobodyさん
02/08/30 23:09ID:???0574名無しさん@Meadow
02/08/30 23:18ID:???perldoc -q url
0575nobodyさん
02/08/31 07:19ID:OvxGQyUv0576nobodyさん
02/09/01 16:35ID:qOjuyzjxhttp://openlab.ring.gr.jp/k16/htmllint/explain.html#excluded-url
0577名無しさん@Meadow
02/09/04 03:47ID:zyxWHEDDsjisでは、全角記号は、ほとんど(全部?)\x81から始まっているので、
/[^※]+/とすると全角記号が入っている場合は合致しないんです。
この理解で合っていますか。
0579nobodyたん
02/09/04 13:17ID:???ftp://ftp.iij.ad.jp/pub/rfc/rfc2396.txt
http://www.japu.org/tmp/http.c
0580nobodyさん
02/09/05 01:39ID:???^[A-Za-z0-9/]{8}$
PHPなんですけど
0581nobodyさん
02/09/05 12:34ID:qJJ4ywe1「>」から「;」の前までの文字の色を青くして
「;」は消去したいんですが、
$hoge =~ s/(^>[.]);/<font color=blue>$1</font>/ig;
ではダメみたいです。
全角文字がいけないのか、半角のセミコロンはつかえないのか、
そもそもなにか間違ってるのかわかりません。
だれか正解を教えてください。
0582581
02/09/05 12:39ID:qJJ4ywe1$hoge =~ s/(>.+);/<font color=blue>$1<\/font>/ig;
ここまで行きました。
まだ間違ってますか?
0583nobodyさん
02/09/05 12:55ID:87M5TYG6英文字使ってないならオプションのiはいらんだろ。
.+? か [^;]+ にしないと>の後にセミコロンが複数あった時
最後のセミコロンまでの全ての文字がマッチしちゃうぞ。
$hoge =~ s/(>[^;]+);/<font color=blue>$1<\/font>/g;
あとタグを扱う場合は区切り文字変えた方が
/のエスケープ要らなくなって見やすい。
$hoge =~ s|(>[^;]+);|<font color=blue>$1</font>|g;
( ´,_ゝ`) プッ
0585581
02/09/05 13:46ID:qJJ4ywe1>あああ >おおお;
ってやると最初の>から;まで青くなってしまいます。
>おおお;
だけ青くしたいんです。
0587581
02/09/05 13:54ID:qJJ4ywe1すいません。わすれてました
でもこれで大丈夫のようです。
なぜか改行はいっても大丈夫(色がかわらない)のですが、なんででしょうか?
べつに変わらなくてよいのでいいんですけども、理由が気になります。
■ このスレッドは過去ログ倉庫に格納されています