正規表現道場@2ch Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/24 22:57ID:LrbVcl3Yこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは>>2-5のあたりに。
0359nobodyさん
03/04/11 13:09ID:???0360nobodyさん
03/04/11 19:44ID:???0361nobodyさん
03/04/15 07:50ID:???空白と@を除く全ての1バイト文字とは違うの?
ドメインにより制限があるが、流動的になり得るので、
ドメイン別の場合分けは無意味と思う。
(1バイト文字=A-Z,a-z,0-9,キーボードから打てる記号)
0362はしのえみ好きー
03/04/15 08:10ID:???0363nobodyさん
03/04/15 12:10ID:GI84bLWkダブルコーテーションで必ず囲みたい!
"aaa → "aaa"
aaa" → "aaa"
aaa → "aaa"
どうする?正規表現!
0364nobodyさん
03/04/15 12:18ID:VH8m0AHo0365nobodyさん
03/04/15 13:14ID:x65/25rDありがとうございます。
でも実行してみたら
"aaa → ""aaa
となってしまいました。。
0366nobodyさん
03/04/15 13:20ID:???まじで?
私は、余計なかっこがついてきたよ。
だから、こう書き直したら、直ったよ。
s/^\"?([^\"]+)\"?$/\"\1\"/;
0367nobodyさん
03/04/15 14:26ID:fimoekOyありがとうございました。
直りました。
0368nobodyさん
03/04/15 18:15ID:???それから、正規表現中の"は意味は無いからエスケープする必要は無い。
で、自分ならこう書く。
s/^"?(.*?)"?$/"$1"/
0369nobodyさん
03/04/15 18:25ID:W26JC1siどうするんだろう・・・
超バッド←「超」にマッチ
超能力←「超」にマッチ
超クール←マッチしない
/超^(クール)/ じゃダメらしい・・・
unless(/超クール/){
if /超/
以外でひとつ・・・
0370nobodyさん
03/04/15 18:29ID:???0372nobodyさん
03/04/15 18:54ID:???\n{5,} マッチしませんでした
\n\n\n\n\n マッチしませんでした
どなたかお願いします・・・。
0373あぼーん
NGNG0375nobodyさん
03/04/15 19:14ID:???0376nobodyさん
03/04/15 19:41ID:???(?! ) (?= ) とか。そういうのは断り書きしたほうが委員でないか
0377nobodyさん
03/04/15 20:09ID:???何を使ってやりたいのかをちゃんと書いたほうがいいと思う
0379nobodyさん
03/04/15 23:21ID:qSlvjohaで,具体的には不等式の左辺と右辺を取り出したい。
たとえば,
$statement = q["abc de" > 123 or abcde = "zz zz"];
だと,"abc de"とabcdeが左辺,123と"zz zz"が右辺。
これを解析するために
$operand = '(?:<=|>=|>|<|=)';
$var = '(?:\w+|"[^"]*")';
$statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g;
print $statement;
とかすると
(left) "abc de" (right) 123 or (left) abcde (right) "zz zz"
という出力が得られる。
さて,
0380nobodyさん
03/04/15 23:22ID:qSlvjoha$statement = q["abc de" > 123 or abcde = 'zz zz'];
の場合に
(left) "abc de" (right) 123 or (left) abcde (right) 'zz zz'
としたい。
$operand = '(?:<=|>=|>|<|=)';
$var = q!(?:\w+|("|')[^\1]*\1)!; #ここを変えた
$statement = q["abc de" >123 or abcde = 'zz zz'];
$statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g;
print $statement;
だとまったく解析が成功しない。どうして?
0381nobodyさん
03/04/15 23:27ID:???本を読んで2日目です、、、急に必要になってしまいました。おやさしいかた、おしえてください。よろしくおねがいいたします。
0382nobodyさん
03/04/15 23:35ID:qSlvjohahttp://www.din.or.jp/~ohzaki/perl.htm#JP_Fold
0383nobodyさん
03/04/15 23:37ID:???$statement =~ s{
(\w+|"[^"]+"|'[^']+')
\s*
(?:[<>]=?|=)
\s*
(\w+|"[^"]+"|'[^']+')
}
{(left) $1 (right) $2}gx;
0385nobodyさん
03/04/16 13:17ID:QKerHoGZたしかPerlメモで拾った
<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)
では、マッチしないケースがあるみたいです。
(ここのHTMLなど:http://messages.yahoo.co.jp/yahoo/Computers___Internet/Hardware/Mobile_Phones_/index.html)
<!(?:--(?:(?!--).)*--\s*)*>
だと大丈夫なんですが、十分なんでしょうか?
他にコメントタグの記述形式があれば知りたいです。
0386nobodyさん
03/04/17 11:44ID:326c+Ekvある文字列内に、所定の単語が含まれていない 場合を判定する正規表現を書きたいです。どういう書き方が良いですか。
[^abc] ですと、a,b,cのいずれかが含まれていない、という判定になってしまいます。そうでなく、abc という文字列が含まれていない、というのを判定したいです。
0389nobodyさん
03/04/17 13:17ID:???とか
perl,rubyあたりでしかつかえんよーな・・・
0390nobodyさん
03/04/19 15:42ID:???どのようにすればいいのでしょうか?
例えば<td>などで挟まれているhttp://www*.hoge.ne.jp/*****(*は任意の数字)だけを
抽出したいのです
0391nobodyさん
03/04/19 16:06ID:9ZhNrFm80392はしのえみ好きー
03/04/19 17:08ID:???/<[^>]+>http://www\d+.hoge.ne.jp/\d+</[^>]+>/
?
0393はしのえみ好きー
03/04/19 17:08ID:???0394はしのえみ好きー
03/04/19 17:11ID:???しかもピリオドエスケープしてなかったし(もうだめぽ(´・ω・`)
<[^>]+>http://www\d+\.hoge\.ne\.jp/\d+</[^>]+>
0395nobodyさん
03/04/19 20:00ID:???0396386
03/04/19 23:46ID:???0397山崎渉
03/04/20 05:59ID:???( ^^ )< ぬるぽ(^^)
0398nobodyさん
03/04/24 17:15ID:/44ojQ66の範囲を削除したいのですが、こんなんでいいんでしょうか。
s/<script[\s.\S]\s*(.*)\s*>[\s.\S]*<\s*\/script>//gi
0399398
03/04/24 18:29ID:/44ojQ66s/<script\s*.+?>.+?\s*<\/script>//gi
これに落ち着いた感じなんですが、どうでしょうか?
0400nobodyさん
03/04/24 18:32ID:???0401nobodyさん
03/04/24 18:33ID:???か。。
0403nobodyさん
03/04/24 23:39ID:???0404nobodyさん
03/04/24 23:40ID:???0405399
03/04/25 01:34ID:fbvwVtSF>>399の記述でも、目的は達しているように見えるのですが、
ご教示頂いたものを試してみようと思います。
現在、コメントタグの削除に取り組んでいますが、
s/<!--[^>]*-->//g
これで、一応目的は達しているように見えます。
複数行またがるコメントタグも削除できているようです。
しかし、より効果的な記述方法はあるでしょうか?
0406nobodyさん
03/04/25 04:34ID:???コメントタグは < >が含まれることがある(というかブラウザー的にはエラーにならない)
のでそれじゃ駄目
あと、改行も問題有るので
s/<!--(?:(?!-->).)*)-->//gs
ぐらいにしとかにゃだめなんじゃない
0407nobodyさん
03/04/25 05:04ID:???http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
0408405
03/04/25 10:00ID:EpsK+/d8クスコです。試してみます。
>>407
情報源、クスコです。
Perlメモは読んでまして、そこのコメントタグも試しました。
ただ、あれでは意図しない部分まで削除してしまうケースがあるようです。
0409123
03/04/25 10:36ID:HCZY3VXf※jdk1.3は正規表現はつかえないから別のライブラリを使う(以下参照)
※jdk1.4は標準でついていたのでそれを使う(使い方忘れた、自分で探せ)
String aaa = \"123456789\";
Pattern pattern_1 = compiler.compile("456",Perl5Compiler.CASE_INSENSITIVE_MASK);
aaa = Util.substitute(matcher,pattern_1,000,aaa,Util.SUBSTITUTE_ALL);
0410405
03/04/25 12:08ID:EpsK+/d8SCRIPTタグの削除も含んでます。
http://www.faqts.com/knowledge_base/view.phtml/aid/21761/fid/597
これの下の方。
/<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style|SCRIPT|STYLE)[\s\S]*?<\/(?:script|style|SCRIPT|STYLE)>)/g;
これ使ったら、見事にうまくいったヨカン。
0411あぼーん
NGNG0412あぼーん
NGNG0413nobodyさん
03/04/26 00:57ID:IuuTGNpAメアドの正規表現ってこんな感じでいいの(初心者でつ)?
0415nobodyさん
03/04/26 13:56ID:???[^@]+@[a-zA-Z0-9\-_]\.[a-z]{,3}
0416nobodyさん
03/04/26 19:14ID:???0418nobodyさん
03/04/26 19:28ID:???0419nobodyさん
03/04/26 20:02ID:???無かった事にしてくれ。
(でも、確かRFC的には許容内なんだよな。鬱)
0420nobodyさん
03/04/26 21:59ID:???RFCに適合するかどうかのチェックなら厳密にやらなければならないし、
実際には許されない架空のアドレス風味を表すだけなら簡単だし。
0421nobodyさん
03/04/27 01:10ID:???0422nobodyさん
03/05/07 01:48ID:U7blGvbH基本的には\が重なること以外にはPerl5と同じはずです。
これ↓を
SELECT * FROM MEMBER WHERE {NAME='[personName]' AND }AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE;
こういう風に
SELECT * FROM MEMBER WHERE AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE;
変換したいのですが下記ではだめなのでしょうか。
/\\{.*?\\[personName\\].*?\\}//
0424nobodyさん
03/05/07 03:09ID:???@よりもあとを正引きしてMXレコードがあるかどうか
調べるとかどう?
0425nobodyさん
03/05/07 03:11ID:???MXレコードがあるかどうかだけ調べてみるとか
DNS鯖とか落ちてたら登録拒否できるから
確認のメール送る場合とか結構有効じゃない?
0427見習い中
03/05/07 09:46ID:l7Gf5uMD今、正規表現を使って半角英数字のチェックを行っているのですが、
入力テキストエリアに半角英数字が入力されたら、エラーを出すように
したいのですが、
if ($in{'name'} !~ /[a-zA-Z0-9\-]+/ ) { &error("エラーです"); }
としたところ、半角英数字はエラーを返すのですが、
全角英字大文字(ABC)と全角数字(123)も反応してしまいます。
(ToT)...
全角英字小文字(abc)は反応しませんでした。。
半角英数字の入力のみエラーを返したいのですが、どなたか教えてください。
0428あぼーん
NGNG0429nobodyさん
03/05/07 10:52ID:???もしかしてAだけの入力ならうまく動作しませんか?
バイナリエディタを使ってABC周辺のバイトコードと
abc周辺のバイトコードを比較してみましょう。
0430427
03/05/08 12:05ID:0MiTKfYxいろんなサイトを調べてみたら、こんなのがあってやってみました。
jcode::convert(\$in{'name'}, 'euc');
if ($in{'name'} !~ /^[\xA1-\xFE][\xA1-\xFE]+$/ ) { &error("エラーです"); }
とやったら、うまくいきました。(全角文字以外はエラーを返します。)
jcode.plの力ということでしょうか。。。プログラムは奥がふかいです。。。
0432nobodyさん
03/05/10 18:06ID:/HHBMizpニュースサイトからアンカータグの部分だけを取得してくるスクリプトを
書いていたのですが、htmlソースの一行の中に複数のアンカータグがあった場合、
その全てをきれいに抽出できないのです。例えば、抽出したい元のソースが
<a href="http://aaa.com/">あああ</a>、<a href="http://iii.com/">いいい</a><br>
のようになっていたとして、正規表現でそれぞれのタグにマッチングさせようとしても何故か
『<a href="http://aaa.com/">あああ</a>、<a href="http://iii.com/">いいい</a>』か、
『<a href="http://iii.com/">いいい</a>』だけか、
『<a href="http://aaa.com/">あああ</a>』だけといったようにしか抽出できず、
純粋に
『<a href="http://aaa.com/">あああ</a>』と『<a href="http://iii.com/">いいい</a>』
の2つを取り出せないのです。
拙いながらこのようなことを散々試したのですが……。
while( $list =~ /<a\s.*href="{1}?.*"{1}?.*>{1}?.*<\/a>{1}?/g )
{
print $&;
}
どなたか、助言していただけませんでしょうか。
0433432
03/05/10 18:09ID:???0434nobodyさん
03/05/10 19:16ID:???0435nobodyさん
03/05/10 19:44ID:???マイナス25点ってとこだな。なぜマイナスかと言うと、使うと損するくらい
まともに処理できてないからな。
まア、80点以上が出たらわたしのほうから正解を書くとしよう。
0436nobodyさん
03/05/10 20:18ID:???0440nobodyさん
03/05/10 23:28ID:???HTML::LinkExtor->new(
sub {
my ($tag, %attr) = @_;
push @links, values %attr;
}
)->parse(\$list);
print "$_\n" foreach @links;
0441nobodyさん
03/05/10 23:40ID:???print "$1,$2\n" while $list =~ m#<a href="([^"]+)">([^<]*)</a>#ig;
これで妥協して。
0442nobodyさん
03/05/11 00:24ID:???0443nobodyさん
03/05/11 00:41ID:???0445センスのない432
03/05/11 07:00ID:???name="" id="" class="" target="" 等が入った場合にも対応できたので、
とりあえずこれで良しとします。ありがとうございました。>434-444
0446405
03/05/11 10:38ID:QXPmJshpm#<a.+?\s*href\s*=.+?\s*>#ig
あたりでどう?
<a name="" target="" href="http://hoge">
ってケースもある。
0448nobodyさん
03/05/11 12:33ID:???0449nobodyさん
03/05/11 14:25ID:QXPmJshpいいよ
0450nobodyさん
03/05/11 15:26ID:???read(FILE, $doc, -s FILE);
while( $doc =~ m|<a.*?/a>|isg ){
my $temp = $MATCH;
$temp =~ s/\n//g;
print $temp,"\n";
}
close FILE;
0451435
03/05/11 16:12ID:???<applet><a href="hoge">abc</a>
<address><a href="hoge">abc</a>
<area><a href="hoge">abc</a>
あらゆる可能性も考慮しないと・・・30点
0452nobodyさん
03/05/11 16:24ID:???my @tag = $_ =~ m/<a([^>]).>/g;
@uri = map{ m/($http_regx)/; $1; } @tag;
}
$http_regxは自分で調べること
0453nobodyさん
03/05/11 17:16ID:???{
my @tag = $data =~ m/<a([^>].)>/g;
@uri = map{ m/($http_regx)/; $1; } @tag;
}
0454nobodyさん
03/05/11 17:23ID:???■ このスレッドは過去ログ倉庫に格納されています