正規表現道場@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さん辺りが書いてくれるカモ・・・・
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すいません。わすれてました
でもこれで大丈夫のようです。
なぜか改行はいっても大丈夫(色がかわらない)のですが、なんででしょうか?
べつに変わらなくてよいのでいいんですけども、理由が気になります。
0588nobodyさん
02/09/05 14:06ID:???$_ =~ s/(PAT)/$1/g;
}
とか
for (@foo) {
$_ =~ s/(PAT)/$1/g;
}
してるんなら、$_には読みこんだ一行しか入ってないから。
$/ = ''でもしとけ。
つか、全然正規表現じゃねーだろ。青らくだかって勉強しろボケ。
0590nobodyさん
02/09/05 14:21ID:87M5TYG6それじゃダメ。
>のコードは\x81\x84なので
[^;>]は[^;\x81\x84]と等価。ちなみに^は最初に一つ置くだけでいい。
つまり;か81か84が出てきたら全て否定されるので。81か84を含むコードを
持つ文字がある場合にマッチしなくなる。
こうしれ。
$hoge =~ s|(>(?![^;]+>)[^;]+);|<font color=blue>$1</font>|g;
0591581
02/09/05 14:24ID:qJJ4ywe1ありがとう!
なぜか「→」とかの記号が中に入ると
ダメになっちゃったんだよ。
そういうことか。マジでありがとう!
ちなみに改行は大丈夫でした。記号が入っていたようです。すみませんでした。
0592581
02/09/05 14:28ID:qJJ4ywe1・・・なにもマッチしないんですけど・・・。
なんでだろ。
0593nobodyさん
02/09/05 14:36ID:87M5TYG6上の例だとマッチするが…
下記に確認に使ったソースを載せとく。
他に何か言い忘れてる事ある?
マッチさせたくてさせられなかった文字列はどんな?
#! /usr/local/bin/perl
print "Content-type: text/plain\n\n";
$hoge = '>あああ >おおお;';
$hoge =~ s|(>(?![^;]+>)[^;]+);|<font color=blue>$1</font>|g;
print "$hoge";
0594581
02/09/05 14:40ID:qJJ4ywe1すいません
バッチリでした。
ちょっとぜんぜん関係ないところでミスってました。
本当に申し訳ありませんが、もうひとつだけ条件追加させてください。
>と;の間で改行したらマッチしないようにしたいです。
この場合の改行は<br>なので改行コードではないです。
だから簡単だと思ったのですが、「<br>」という文字列を丸ごと指定する方法が
わかりません。
こまった。
0595nobodyさん
02/09/05 14:53ID:87M5TYG6$hoge =~ s%(>(?![^;]*(?:>|<br>))[^;]*);%<font color=blue>$1</font>%ig;
どこに<br>が入ってるかわかんないので+を*に変えといた。
ので、>;でもマッチしてしまうが。
0596581
02/09/05 15:11ID:qJJ4ywe1>;でマッチするのはぜんぜんOKです。
ありがとうございました!
0597nobodyさん
02/09/05 16:03ID:???>の部分にマッチしてしまう罠。
0599nobodyさん
02/09/14 03:35ID:ptF5alUdあほ、あへへ、とかにヒットするようにしたいんですが、やり方わかりません。
if ($DB[$key] =~ /^$QUERY{'hd'}.*/) 〜
とかやってみました。ぜんぜんだめです。「{」は「\{」って書くんですか?
やってみたけどだめでした。どやってやったらいいですか。
0600名無しさん@Meadow
02/09/14 08:27ID:???条件をもっと正確に書きましょう
「あほ、あへへ、とか」って?
$DB[$key]が「あ」で始まる任意の文字列にマッチする場合ということなら
if ($DB[$key] =~ /^$QUERY{'hd'}.*/) 〜
これでええです。
エラーをもっと正確に書きましょう
「ぜんぜんだめです。」って?
エラーメッセージを見ればほとんどのことは分かるんです
0601nobodyさん
02/09/14 16:49ID:???0602名無しさん@Meadow
02/09/14 21:28ID:???$ perl -e '$var="abc"; if ($var=~/b/){print "601 is an aho!\n";}'
601 is an aho!
0603名無しさん@Meadow
02/09/14 21:30ID:???601 is God!\n";}'
601 is God!
0605名無しさん@Meadow
02/09/15 07:34ID:???>>604はdoah(略
0606nobodyさん
02/09/16 22:01ID:l9cfV4Lxだめでした。どうやって書けばいいですか。よろしくお願いします。
$error_flags = "0000000000000";
$error_flags =~ s/^(\d{1})\d{1}(\d{11})$/\11\2/g if ($QUERY{'form_v2'} eq "");
$error_flags =~ s/^(\d{2})\d{1}(\d{10})$/\11\2/g if ($QUERY{'form_v3'} eq "");
0607nobodyさん
02/09/16 22:10ID:???0608nobodyさん
02/09/16 22:16ID:???どうもありがとうございます。
0609nobodyさん
02/09/17 02:24ID:QLf2zkHZif($word=~/^[0..9]{3,3}$/){ print"ok";}
\dなど使わないでこの形式で正して下さい。
0610名無しさん@Meadow
02/09/17 02:42ID:???相当の初心者さんですね
[0-9]{3}
0611nobodyさん
02/09/17 03:51ID:QLf2zkHZできた。できた。ありがとうございます。{3,3}でもできた。
0612nobodyさん
02/09/17 08:17ID:???>{3,3}でもできた。
そりゃできるだろうけど、「3文字の数字」を探すときにわざわざ
「3文字以上3文字以下の数字」って書くのはちょっとね。
0613nobodyさん
02/09/17 09:33ID:???0616名無しさん@Meadow
02/09/17 12:33ID:???不合格!!
よく問題を読みましょう.
\dを使わずにやれとある
0617nobodyさん
02/09/17 12:37ID:???0618nobodyさん
02/09/18 11:38ID:???0619nobodyさん
02/09/18 18:06ID:???0620nobodyさん
02/09/22 08:08ID:GGE38Iwz12345 や 67890 や at41n や hyrdf985 や s4r などの文字列を
12 67 at hy s4
のように先頭の2文字だけに変換させるのはどうしたらよいでしょうー。
substr使えやゴルァ といわずに、正規表現でやってみたいのです。
何文字あるのかわからないため、...$ などは使えないし。
s/^..// なんてやると2文字だけ消えてしまうし、、
$_ = '1234567';
/(^..)/;
ってやれば、$_ = $1 でできるかもしれないけど、こんな手間かけるのもアレやし、、
s/先頭の2文字でない文字//;
とかやりたいの。
■ このスレッドは過去ログ倉庫に格納されています