トップページ⇒php
1001コメント313KB

正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/11/19 21:42ID:Kst3Nn4S
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、&amp " と描いておきましょうね。

Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
 http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
 http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
 http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
 http://www2.famille.ne.jp/~akio1998/l_grep.html

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
0456nobodyさん04/06/21 13:16ID:???
s|\d{1,4}|<a name="$&">$&</a>|;

きっとこんなんじゃ駄目なんだろうな。
045745504/06/21 13:20ID:???
いろいろぐぐって自己解決いたしました。
[0-9]+\f →<a name="\0">\0</a>
これで出来るようになりました。
今度からもっと調べてから書き込みますね。
スレ汚し失礼しました。
0458nobodyさん04/06/21 13:23ID:???
>>456
すいません、書き込んでいる間にレス下さってたんですね。
ありがとうございます<(. .)>
0459nobodyさん04/06/23 14:38ID:StfIGGBa
'<tag>test1<tag>test2</tag>test3</tag>';

上記の文字列から'test2'の部分だけを取り出したいのですが、
'm /<tag>(.*?)<\/tag>/;' では$1に 'test1<tag>test2' まで入ってしまいます。
'm /<tag>.*?<tag>(.*?)<\/tag>/;' で望みどおりにはなるのですが
エレガントではないように思います。
もっと良い表現はないでしょうか?
0460nobodyさん04/06/23 15:40ID:???
m!.<tag>(.*?)!;
046146004/06/23 15:57ID:???
m!.<tag>(.*?)<!;
0462nobodyさん04/06/23 16:02ID:???
ありがとうございます。>>461
0463nobodyさん04/06/23 18:16ID:???
正規表現2chスレッド (WEBプログラミング) http://pwiki.chbox.com/pukiwiki.php?%C0%B5%B5%AC%C9%BD%B8%BD


(03/11/19) http://snapshot.publog.net/html/php/2003/11/19/214238.html
(02/11/24) http://pc5.2ch.net/php/kako/1038/10381/1038146241.html
(01/07/26) http://pc.2ch.net/php/kako/996/996105815.html
0464nobodyさん04/06/24 22:52ID:???
正規表現掲示板 - Users Group of EmEditor FrontPage

http://cgi25.plala.or.jp/~c6h6/em_wiki/index.php?%C0%B5%B5%AC%C9%BD%B8%BD%B7%C7%BC%A8%C8%C4
0465nobodyさん04/06/25 11:54ID:g4l68VjT
"A1B5A2B6A3B7A4B8"

と言う文字列があったとして、'B'の2個目の後ろの数字とか、
'A'の3個目の数字などの指定はどうしたら良いでしょうか?
Perlでお願いします。

{m回目にマッチ}を使えば良いかと思ったのですが、使いかたがわかりません。
0466nobodyさん04/06/25 12:01ID:g4l68VjT
書き忘れましたが
m /.{3}(\d)/;
とかで'B'の2個目の後ろの数字は取り出せるのですが、
'A'や'B'はhtmlのタグの変わりですので、任意の文字列の
希望するヒット回数の後ろの文字列を取り出したいと思っています。
0467nobodyさん04/06/25 12:15ID:???
>>466
もうちょっと元々何をやりたかったかを具体的に。
0468nobodyさん04/06/25 12:20ID:???
つか、{m}はm回数目にマッチじゃないからね。
/.*B.*B(\d)/
とかやるしかないんじゃないの?
0469nobodyさん04/06/25 12:25ID:g4l68VjT
>>467

htmlの中の2個目のtableタグの中の文字列を取り出したり、
3個目の画像のURLを取り出したりしたいです。

>>468
>つか、{m}はm回数目にマッチじゃないからね。

ご教授ありがとうございます。
0470nobodyさん04/06/25 12:34ID:???
>>469
だから具体的にそのタグを書けと(ry
047146804/06/25 12:36ID:???
回数固定じゃないならこうかな? mとかBのところは適宜入れてやる。
/(?:.*?B){m}(\d)/

……でもこれってHTML解析とは違うような気がする。
0472nobodyさん04/06/25 12:46ID:g4l68VjT
>>470
2個目の<tabe></table>内の10個目の<td></td>の間の文字列を取り出したいのですが、
エレガントな表記方法をお願いします。

>>471
まだまだ初心者なので的確な表現ができなくて申し訳ありません。
自分で調べるとっかかりが欲しかったので、>>465のような質問にしました。
0473nobodyさん04/06/25 13:09ID:???
>>472
具体的という意味がわからないならもう帰っていいよ
0474nobodyさん04/06/25 13:15ID:???
HTML のパースネタは盛り上がる (≒ 荒れる) ねえ。

>>472
そのくらい複雑なことするようなら HTML パースライブラリ使った方が吉。
0475nobodyさん04/06/25 13:31ID:g4l68VjT
>>473

ぐたい-てき 0 【具体的】
一般的なものや観念的なものではなく、個々の事実によっているさま。
「―に例をあげる」

具体的に例をあげているだろうが。
具体的という意味がわからないならもう帰っていいよ

>>474
>そのくらい複雑なことするようなら HTML パースライブラリ使った方が吉

ご教授ありがとうございます。
HTML パースライブラリというのを知っただけでも大きな収穫を得ました。
0476nobodyさん04/06/25 13:42ID:???
なんだよ、やっぱり分かってねぇじゃん。
一番必要なのは日本語の勉強だな。
0477nobodyさん04/06/25 14:10ID:???
>>475
>2個目の<tabe></table>内
<table><td><table/></td></table><table/>
どれが2個目のテーブルですか。

どこが具体的ですか。
脳内ですか。そうですか。
おめでたい頭してますね。カワイそうに。
0478nobodyさん04/06/27 01:16ID:???
>>475
HTMLもわかってないようだからそっちを先に勉強しなさい。
マスターするまで二度とこの板には来ないこと。
047946204/06/29 17:06ID:???
>>463
ごめんなさい。
ereg_replace("\++","+",$word);
で出来ました。
0480nobodyさん04/06/29 20:28ID:8D9V5eyp
$str = "<a href=http://www.abc.com/>;<b>ABC</b>company</a>";
preg_match("/<a href=(.*)>(.*)<\/a>/i",$str,$str_reg);
これだと、<b></b>があるため、URLとタイトルがうまく抜き取れません。

http://www.abc.com/
<b>ABC</b>company
の2つを抜き出したいのですが、どうしたらいいのでしょうか?
<b>タグが入っていない場合は、うまくいくのですが…。
0481nobodyさん04/06/29 21:16ID:???
>>480
preg_match("/<a href=(.*?)>(.*?)<\/a>/i",$str,$str_reg);
048248004/06/29 22:01ID:???
>>481
ありがとうございます。できました!
0483nobodyさん04/07/03 16:46ID:3JpN2Yos
DoCoMo/2.0 N2001(c10;ser***************; iccxxxxxxxxxxxxxxxxxxxx)
や
DoCoMo/1.0/X503i/c10/ser***********
から
ser**********←これは11〜15桁のユニークな英数字
を得たい。
それと、
http://www.dp.j-phone.com/dp/tool_dl/web/useragent.php
J-PHONE/4.0/J-SH51/SN************ SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0
Ext-Profile/JSCL-1.1.0
SN************←12桁のユニークな英数字
を得たい。
よろしくお願いします。
0484nobodyさん04/07/03 16:48ID:???
ser\d{11,15}
SN\d{12}
0485nobodyさん04/07/03 16:59ID:???
>>484
それはかわいそうだろw
0486nobodyさん04/07/03 17:18ID:???
>>484
ありがとうございます。
PHPなのですが、、、もう少し詳しくお願いします
0487nobodyさん04/07/16 14:35ID:IH9/xCo3
>>11さんとは逆に、
アラビア数字(第1条〜第999条)を漢数字(第一条〜第九百九十九条)に置き換える式を教えてください。
0488nobodyさん04/07/16 15:37ID:ihM1iEsJ
次の場合、どのようにすればいいのでしょう?

「http://hoge.com/***」の***が、先頭一致で(aaa/|bbb/)以外の場合に、
hoge.com/***をhoge.com/index.cgi?***に変換。
〔(aaa/|bbb/)の場合通常のリクエストと見なす〕
〔***は任意〕
Apacheのmod_rewriteで行い、記述は.htaccessで行う。
0489nobodyさん04/07/16 16:01ID:???
>>488
.htaccess質問コーナー Part2
http://pc5.2ch.net/test/read.cgi/hp/1084861566/
0490nobodyさん04/07/16 16:13ID:???
>>489
【Apache】mod_rewriteについて語るスレ
http://pc5.2ch.net/test/read.cgi/php/1023791370/

というのもありますが、どちらがいいのでしょうか?
0491nobodyさん04/07/16 17:28ID:???
PHPの質問なのですが、全角・半角を無視して検索文字列をハイライトするいい方法ありませんかね?
パフォーマンスが悪いのは承知で、
$hage = mb_convert_case($hoge, 'asKV')
$hage = preg_replace('/pattern/', '<span class="match">$0</span>', $hage);
$part = preg_split('/(<.+?>)/', $hage, 0, PREG_SPLIT_DELIM_CAPTURE);
$result = '';
$pos = 0;
foreach ($part as $key => $value) {
if ($key % 2 == 0) {
if (($len = mb_strlen($value)) > 0) {
$result .= mb_substr($hoge, $pos, $len);
$pos .= $len;
}
} else {
$result .= $value;
}
}
というのも考えてみたけど半角の濁点の処理などをさらに追加せねばならず、大変。
mb_ereg_replaceかpreg_replaceのオプションで全角半角を無視ってのできないかなあ。
0492nobodyさん04/07/16 17:35ID:???
>>491
PHPスレで聞いたほうがいい
0493nobodyさん04/07/17 01:01ID:l2+iEUo8
PHPで。
雑多な文字列の入ったテキストファイルの中から、ホスト名を抽出するにはどう書けばいいのでしょう。
実際やりたいことは、テキストファイルからホスト名部分を抽出→ereg_replaceで空白に置換え。
つまりホスト名の削除です。



0494nobodyさん04/07/17 01:19ID:???
>>493
そのホスト名に当てはまる条件を提示してください
0495nobodyさん04/07/17 04:58ID:aixfBR+9
はじめまして。

以下のような文字列にて"#"より後ろの文字列を
正規表現を使用したeregi_replace関数を用いて全て削除しようと考えています。
("#"も含みます)

$stirng = "あいうえおaiueo#かきくけこ"

以下のようにやっていますが、うまくいきません。
$b = eregi_replace("[#.*]","",$stirng);

どのようにすればよいのでしょうか?
0496nobodyさん04/07/17 07:45ID:???
>>495
"#.*"
0497nobodyさん04/07/17 11:31ID:l2+iEUo8
493です。
>>494
各行から以下のような形式のホスト名部分を削除
#####
YahooBB***********.bbtec.net
\\******.ppp.dion.ne.jp
\*****-*****\\****\-acca.tokyo.ocn.ne.jp
\\***\*\.speednet.ne.jp
\\\.\\\.\\\.\\.ap.highway.ne.jp
 *=数字  \=アルファベット(大文字小文字混在)
#####
これ以外にも出来るだけ柔軟に対応させたいのです。
スクリプトの行数が多くなるのは覚悟の上です。
0498nobodyさん04/07/17 11:47ID:???
>>497
>>102-114
0499nobodyさん04/07/17 14:48ID:TroGWL8b
>>496
ありがとうございます!
本当に助かりました。^^
0500nobodyさん04/07/17 15:11ID:TroGWL8b
split関数にて以下のようなスペースが1つもしくは複数連続に続いてる部分を区切りとして
配列にする場合、split関数の引数はどのように書けばよいでしょうか?

$b = "    02600 0                1111"

現在、$a=split(" *",$b);でやっておりますが、うまく出来ません。

よろしくお願い致します。
0501nobodyさん04/07/17 15:15ID:TroGWL8b
>>500
訂正です。
$a=split(" +",$b);でやっておりますが、うまく出来ません。

補足です。
上記の例の場合、配列$aに以下のように入れたいと思っています。
$a[0]=02600
$a[1]=0
$a[0]=1111

よろしくお願い致します。
0502nobodyさん04/07/17 15:16ID:TroGWL8b
>>501
すいません。また訂正です。

$a[0]=1111
↓↓↓↓↓
$a[2]=1111
0503nobodyさん04/07/17 15:30ID:TroGWL8b
>>502
出来ました。

スペースの全角と半角の区別をしてなかったのが原因でした。
失礼しました。
0504nobodyさん04/07/18 10:56ID:???
/"[^"]*"/
これでダブルクオートに囲まれた文字列に一致すると思うんですが、
ダブルクオートの中にエスケープされたダブルクオートがあると、そこまでで一致終了してしまいます。
当然ですが。

エスケープされた物を無視させるにはどうすればいいですか
0505nobodyさん04/07/18 11:12ID:???
/".*"/
0506nobodyさん04/07/18 11:45ID:???
>>504
"foo\"bar" と \ でエスケープするなら
/(?<!\\)"((?:\\"|[^"])*)"/ で $1 に foo\"bar が入る。
…少なくとも Perl 5.005 以降なら。
0507nobodyさん04/07/18 15:24ID:???
>>506
おおっと

なるほど・・・・
\\"|[^"]が思いつかんかった・・・・・
ありがとうございます
0508nobodyさん04/07/18 21:19ID:???
あれ
でもこれだと

"test\""
これに対応しない・・・
test
になっちゃった・・・・・
0509nobodyさん04/07/18 22:03ID:???
ここはチラシの裏じゃありません
0510nobodyさん04/07/18 22:14ID:???
>>508
使用言語とテストコードを書いてくれんと何が悪いか分からんよ。

#!/usr/local/bin/perl
require 5.005;
$_ = '"test\""Test:"\100-", tes"T""t\"e\"S\"t"';
print "$1\n" while /(?<!\\)"((?:\\"|[^"])*)"/g;
print "$1\n" while /(?<!\\)"([^"]*(?:(?<=\\)"[^"]*)*)"/g; # ループ展開版
__END__
0511nobodyさん04/07/18 22:32ID:???
あ、すんません。開発言語はPerlです。

とりあえず、HTMlタグ内とタグ外、コメントとそれ以外に分けて配列化してるんです
言うならば・・・普通のテキストを

#CDATA, tag, tag, tag, comment, #CDATA, comment, tag, comment, tag.......
みたいな感じで。分かりづらかったらすみません
0512nobodyさん04/07/18 22:33ID:K8gWFvF7
$tmp = $str;
undef @tg;
undef @ot;
push @tg, $1 while($str =~ s/(<!--.*?-->)//s);
@ot = split /<!--.*?-->/s, $tmp;
$i = 0;
foreach (@ot){
push str, $_;
push str, $tg[$i++];
}
foreach (@str){
$tmp = $_;
undef @tg;
undef @ot;
undef @strtg;
push @tg, $1 while(s/(<(?:(?:\\"|[^"])*(?<!\\)"(?:\\"|[^"])*")*?>)//s);
@ot = split /(?:<(?:(?:\\"|[^"])*(?<!\\)"(?:\\"|[^"])*")*?>)/s, $tmp;
$i = 0;
foreach $r (@ot){
push ret, $r, $tg[$i++];
}
}
foreach (@ret){
print $i++, $_ if($_ && $_ !~ /\A\s\Z/s);
}
0513nobodyさん04/07/18 22:33ID:???
あ インデント& sageミスった・・
読みづらくてすみません
0514nobodyさん04/07/18 23:15ID:???
色々考えたんですが出来ません。。
眠いので落ちます・・・・
0515nobodyさん04/07/18 23:25ID:???
iswebのヘッダの広告にマッチする正規表現を教えてください。
サンプル
ttp://koumuinsiken.hp.infoseek.co.jp/

初心者ながら頑張ったのは…
<!-- isweb auto-insert \*/ -->\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n

すんません_no
0516nobodyさん04/07/18 23:39ID:???
>>515

/<!-- isweb auto-insert \*\/ -->.*?<!-- inserted by isweb server\/\* -->/s

こんなんじゃないのか?
0517nobodyさん04/07/18 23:52ID:???
ttp://www.boost.org/libs/regex/doc/syntax.html
文法はこれに準拠してるみたいですが、上手くいきません…。
0518nobodyさん04/07/18 23:55ID:???
>>511
HTML の属性値では " を \ でエスケープしたりせんが。
http://search.cpan.org/dist/HTML-Parser/
http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
これ以上はスレ違いになりそうだから余所でやってくれ。
0519nobodyさん04/07/19 00:01ID:???
>>518

あァ勘違い。
どうもありがとうございました・・・これで解決・・・するかな
0520nobodyさん04/07/19 00:02ID:???
>>515-517
http://pc5.2ch.net/test/read.cgi/tech/1062152374/478-480n
が関係あるに 300 ペリカ。
0521nobodyさん04/07/19 00:17ID:???
>>520
Emeditorとかでマッチのテストしてみたんですが、
/<!-- isweb auto-insert \*\/ -->.*?<!-- inserted by isweb server\/\* -->/s
ではうんともすんとも言いませんでした。

なんか基本的な知識が欠けているような気がします。すんません。_no
0522nobodyさん04/07/19 00:47ID:???
>>521
EmEditorなら複数行にマッチするようにチェック入れなきゃダメよ
もちろん/とか/sもいらない
0523nobodyさん04/07/19 00:47ID:???
>>521
http://www.emeditor.com/jp/help/dlg/find/
http://www.emeditor.com/jp/help/howto/search/search_regexp_syntax.htm
http://pc5.2ch.net/test/read.cgi/software/1087716064/

<!--\s+isweb\s+auto-insert\s+\*/\s+-->(.|\s)+?<!--\s+inserted\s+by\s+isweb\s+server/\*\s+-->
0524nobodyさん04/07/19 07:43ID:???
早い返信ありがとうございます。

Emeditorに複数行にマッチする設定が無いのですが…
Pro版のは"."が改行にもマッチするように設定できるみたいですがこれですかね。_no

あといろいろ試してみたのですが、スペースは\sでも でもマッチするみたいです。
<!-- isweb auto-insert \*/ -->

>>523さんのもうんともすんとも言いませんでした。
おそらく複数行にマッチするようにチェック入れないといけないんでしょうけど。

マターリがんがります…。
0525nobodyさん04/07/19 10:24ID:???
<!--\s+isweb\s+auto-insert\s+\*\/\s+-->.+?<!--\s+inserted\s+by\s+isweb\s+server\/\*\s+-->

>>523
コメントタグ中の/のエスケープが抜けている
0526nobodyさん04/07/19 11:59ID:???
>>524
EmEditor v4 Standard をインストールして確認したところ、\s が
改行にマッチしないし \n を含むパターンを量指定できないな。
一般的な正規表現エンジンと挙動が違うから、ここで質問しても
君の望む答は得られんだろう。この糞ソフトを使い続ける気なら
後は >>523 の専用スレに行ってくれ。

真っ当な正規表現エンジンを積んでいるソフトなら >>516 で OK 。

>>525
検索ダイアログに突っ込むのに / は関係無し。
0527nobodyさん04/07/19 12:29ID:???
>>515
宣伝してるのはお前か?
http://pc5.2ch.net/test/read.cgi/hp/1089046899/39
http://pc5.2ch.net/test/read.cgi/hp/1065089862/324
0528nobodyさん04/07/19 12:43ID:???
手持ちのエディタで検証してみたところ
・PeggyPad
 うんともすんとも
・PHPエディタ
 普通の文字、または左括弧"("が必要です.
と出ました。しょぼーん。

秀まるお使ったほうがいいですかね?


>>527
http://www.google.co.jp/search?num=50&lr=lang_ja&ie=Shift_JIS&oe=Shift_JIS&q=infoseek
で一番上に来るサイトを選んだだけです。とりあえず否定しときますです。
0529nobodyさん04/07/19 13:26ID:???
秀丸も正規表現エンジンを変えてやったけどできなかった。
ローカルのperlを利用するマクロならできたけど。

で、マッチしたとして何をしようってのよ?
保存したソースから削除とかなら複数行置換えできるフリーソフトのほうが簡単だぞ。
0530nobodyさん04/07/19 21:20ID:???
ローカルプロキシです。
あっちのスレにも誤解されそうな人がいますが…
0531nobodyさん04/07/19 23:57ID:???
>>529
秀丸がダメなのはヘルプに説明があるよ。
(「検索系コマンド」の「\nを使った複数行検索の際の制限について」)

>>530
エディタのマクロかなんかでプロキシ作るのかい?
0532nobodyさん04/07/22 12:26ID:???
ローカルプロキシって、まさかおみとろんでは...
0533nobodyさん04/07/22 14:35ID:???
ああ、なるほど
広告を非表示にしたいわけか
0534nobodyさん04/07/24 14:34ID:wErUOaoh
文中に自動リンクをしたいのですが、Googleの検索結果のようなめちゃくちゃ長いURLを短くして表示することは出来ますか?

$str = "googleの結果<br>ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&q=ereg_replace&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja<br>..."
$str = ereg_replace("http://[^<>[:space:]]+[[:alnum:]/]","<a href=\\0>\\0</a>", $str);

これをこのように出力したい。
<a href=ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&q=ereg_replace&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja>ttp://www.google.co.jp/search?hl=ja&ie=...</a>
0535nobodyさん04/07/24 14:51ID:???
>>534
$strからgoogleの結果<br>と<br>を取り除いてから
<a href=$str>ttp://www.google.co.jp/search?hl=ja&ie=...</a> でいいだろ。
0536nobodyさん04/07/24 15:12ID:wErUOaoh
早速のレスありがとうございます。

$str はいわゆる掲示板の書き込みのコメント部分です。
で、それを自動リンクしたいんですが、コメント中に長いURLを張るとテーブルが壊れます。
実際のリンクは超略しないで、表示部分だけ短く省略したいんです。
0537nobodyさん04/07/24 16:35ID:???
$str = ereg_replace("http://[^<>[:space:]]+[[:alnum:]/]","<a href=\\0>リンク</a>", $str);
0538nobodyさん04/07/24 17:11ID:wErUOaoh
ttp://ns1.php.gr.jp/pipermail/php-users/2002-April/007102.html
ヘボイらしいのですが、ここを参考にして何とかなりました。
お騒がせしました。
0539nobodyさん04/07/24 23:27ID:b6ZQFx0g
<table> の中の、入れ子構造になっている セルを抽出する方法を教えてください


      <table> <tr> <th> TH1 </th> <td> TD1 </td> </tr> </table>
      <table> <tr> <th>
                 <table> <tr> <th> TH2 </th> <td> TD2 </td> </tr> </table>
                 TH3 </th> <td> TD3 </td> </tr> </table>

欲しいものは、
TH1 と TD1
TH2 と TD2
<table> <tr> <th> TH2 </th> <td> TD2 </td> </tr> </table> TH3 と TD3
です

環境は php4.3 です
0540nobodyさん04/07/25 01:22ID:???
入れ子になっている構造は正規文法で表せません
0541nobodyさん04/07/25 04:31ID:???
xslt とかの方が向いてそうだな
0542nobodyさん04/07/25 06:16ID:???
>>539
http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
0543nobodyさん04/07/26 14:57ID:nr00S6gf
「test.html#aiueo」「abc.jsp#123」という文字列があって
#の前の文字列を取得したい場合はどのような正規表現にすれば良いのでしょうか○| ̄|_
0544nobodyさん04/07/26 15:12ID:???
>>543
^([^#]*)
^(.*?)#
0545nobodyさん04/07/26 15:18ID:???
>>544
ありがとうございます○| ̄|_
うー、もっと勉強しなければ。(*)#とかしてますた。
0546nobodyさん04/07/28 01:04ID:???
xmlで
------------------------
<qqq>
  <abc>123</abc>
  <rrr>aiueo</rrr>
  <abc>456</abc>
</qqq>
------------------------
というような構造のとき、
<qqq>の中の文字列を取り出し
それに対して
/<abc>([^&]+)<\/abc>/
でマッチング処理を行うと、
------------------------
123</abc>
  <rrr>aiueo</rrr>
  <abc>456
------------------------
という結果になってしまいます。
一つ目の<abc>123</abc>に正しく反応させたいのですが
どのようにすればよいのでしょうか。
よろしくお願いいたします。

※マッチング処理の際の
 /<abc>([^&]+)<\/abc>/
 のabc部分は可変です。
0547nobodyさん04/07/28 01:24ID:???
>>546
基本だと思うけれども最小マッチ
/<abc>([^&]+?)<\/abc>/
0548nobodyさん04/07/28 01:37ID:???
>>547
546です。すみません、本当に助かりました。
ありがとうございます。
(とほほさんのHP見ながらやっていたんですが、それ以外にも対応していたり
 するんですね。今後は気をつけます。)
0549nobodyさん04/07/28 01:37ID:???
だからとほほはアテにならない。
0550nobodyさん04/07/28 02:00ID:???
XMLなら正規表現使わずともDOMやSAXで抽出できるんじゃないの
0551nobodyさん04/07/28 02:36ID:???
>>550
むしろそっちの方が正攻法な気も。
0552nobodyさん04/07/29 00:49ID:???
>>547
546ではないけど質問です。

/<abc>([^&]+?)<\/abc>/
だと<abc>123</abc>にはマッチするけど、<abc><123></abc>マッチしませんでした。
こういう文字コードを使われてるものもマッチさせる方法はあるんですか?
0553nobodyさん04/07/29 09:01ID:???
ヴァカには使えない仕様です。
055455204/07/29 10:14ID:???
ごめんなさい、きちんと表示されてませんでした。

<abc>&lt;123&gt;</abc>

↑は/<abc>([^&]+?)<\/abc>/でマッチしないのですが、
マッチさせる方法はあるのですか?
0555nobodyさん04/07/29 10:24ID:???
>>554
[^]の意味を調べたほうがいいよ。
/<abc>([^<>]*)<\/abc>/
0556nobodyさん04/08/01 14:12ID:???
例えばですが、
$aには、変動する数字が代入されているとします。

【$aが、2000で割り切れる値であるとき、真を返す】

もしくは、

【下4桁が、2000・4000・6000・8000・0000のいずれかであるならば、真を返す】

としたい場合には、どのようなソースになりますか?

ご教授お願いいたします。
■ このスレッドは過去ログ倉庫に格納されています