正規表現道場@2ch Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/24 22:57ID:LrbVcl3Yこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは>>2-5のあたりに。
0611nobodyさん
03/06/23 00:44ID:???0612nobodyさん
03/06/23 00:48ID:???ここは別に最初から最後まで手取り足取り教える為のスレッドじゃないんだよ
>>598 で充分過ぎるほどヒント出てるんだから、自分で「正規表現」を
習得しつつコードを書こうという気は起きないのかい?
0613597
03/06/23 02:57ID:???今まで見てきたHTMLで「文法はおかしいけれどありそうなもの」
「このくらいならありえるかな」ってのを>>599にいくつかピックアップしてみました
ちょっとありえないものもあるかもしれません
万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
>>599のリストに、他にもありえそうなものを追加して……
0614nobodyさん
03/06/23 03:03ID:???とりあえずそろそろウザイ。
0615597
03/06/23 03:11ID:???スマソ
とりあえず>>599から>>605にあるように「aをスペースで囲む」を無くして
>>610にも対応したもの
#<a[^>]*\shref\s*=\s*(?:\"([^\"\s]+)\"|'([^'\s]+)'|([^>\s]+))[^>]*>(.+?)</a>#i
0616nobodyさん
03/06/23 03:23ID:???0619nobodyさん
03/06/23 05:27ID:???・hrefの前に>があったら失敗するな(ex. title="<1>")
・行に2つ以上anchorがあったら1つめのマッチングで
最後の</a>までマッチしそうだ
まあがんがれ
0622nobodyさん
03/06/23 18:33ID:???0623nobodyさん
03/06/23 18:50ID:???0624nobodyさん
03/06/23 18:56ID:???0625597
03/06/23 18:57ID:???</a>で閉じられてないってのはどういうことっすか?
「< /a >」だとか「</a <!-- /ここまで -->>」とかですか?
リンクを正規表現で抽出する前に、コメントを取り除いたほうがいいですよね
それとも男なら一度にやるべきでしょうか……
PHPなら「アンカータグ以外を取り除く」なんて簡単に出来ちゃいますし
0626597
03/06/23 19:29ID:???対応しなくてもいいかな、と思いつつ一応やってみたら
<a title="<aaa>" href="http://www.aaa.aaa">他要素の中に<>がある</a>
<a href="http://www.aaa.aaa"><!-- リンク </a> -->文字列にコメントがある</a>
のようなものも上の正規表現で問題なく抽出できました、なんでだろう?w
0627597
03/06/23 19:32ID:???「< /a>」はIE6で正常にリンクされてます。
仕様よりもIEを基準にするな!って怒らないでくださいね
0628nobodyさん
03/06/23 19:43ID:???<a> が明らかに閉じてるべきとこまではリンクと見做してくれてるんでしょ。
アフォな HTML 作成者を救うために。
ところで、パレートの法則って知ってる?
つーか、アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
0629nobodyさん
03/06/23 20:43ID:???IE?いつまでバカブラウザをマンセーしているつもりだよ(つД`)
<a>はインライン要素。
http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/links.html#edef-A
0630nobodyさん
03/06/23 22:32ID:???>アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
だけどこの質問者は「万能な」ものを求めてる。
HTMLがいくら間違ってても抽出したいと思ってるわけだ。
#その時点でオ�hルんだがな。
0631nobodyさん
03/06/23 23:57ID:???0632nobodyさん
03/06/24 00:17ID:VrEbx1+X正規表現を使って、あるテキストの先頭から10行目を取得する書き方が、
解りません…どたか教えて下さい。どうか、お願いします。
JDK1.4.1の正規表現クラスを使ってます。
0633nobodyさん
03/06/24 00:20ID:VrEbx1+X0634nobodyさん
03/06/24 00:58ID:???0635nobodyさん
03/06/24 01:39ID:???$line10 = (split(/\n/, $text))[9];
0638nobodyさん
03/06/24 03:09ID:???/\A((?:.*\n){0,10})/m
0639名無しさん@Meadow
03/06/24 07:35ID:???\Aて何?Perlじゃないでそ。
0640nobodyさん
03/06/24 09:10ID:???文字の最初だよ・・・
ttp://www.kt.rim.or.jp/~kbk/regex/regex.html
見て勉強しなおしなされ
0641名無しさん@Meadow
03/06/24 10:27ID:???べんきょ足りんですた。逝って来マウス。
0642nobodyさん
03/06/24 13:05ID:???title="<aaa>"は正当だよ。
title="<aaa>"と書かれていたときはtitle="<aaa>"と
解釈しなくてはならないが、title="<aaa>"と書いてはいけないという
意味ではない。&を&と書かないと誤解釈する可能性が
あるという問題とごっちゃにされてるんだろうな。
0643nobodyさん
03/06/24 13:10ID:???それならせめてどういう謎HTMLも許容したいのか
仕様を明確にしてくれないと作りようがない。
0644nobodyさん
03/06/24 14:07ID:???0649nobodyさん
03/06/24 18:14ID:???(゚Д゚≡゚Д゚)エッナニナニ?本当か?
0650nobodyさん
03/06/24 18:25ID:???とか
>万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
みたいな他力本願なレスは激しく萎える事に>>597は気づいているのかなー?
0651597
03/06/24 18:45ID:???「今更リンクの抽出かよ……」なんて萎える人もいるでしょうが
まあ暇だし付き合ってやるか、という人もいるかなと思ってはじめました
他力本願ですが、道場ということで甘えてみましたw
>>643-645
仕様といっても難しいので、ありえそうなものを考えると
>>599>>610>>626あたりになるのかなって感じです
今出てるものでは>>615ですべて対応できてるはずです
つーか実際に間違ってるHTMLって多いですよね
リンクを抽出することを考えたときに
HTML書いた人に直すようにメールするか
対応した正規表現にするかどっちが早いかって話です
0652nobodyさん
03/06/24 18:51ID:???0655nobodyさん
03/06/27 13:05ID:???$_ = "w439soz980i505";
@a = /^(?:(\w)(\d{3}|[ao]))+$/;
上のような正規表現で、括弧に入った文字列を全て@aに入れたいんですが、
実際にはループの最後の"i"と"505"だけしか入りません。
全てを@aに入れる方法はあるんでしょうか?
0656nobodyさん
03/06/27 14:07ID:???@a = /((\w)(\d{3}|[ao]))+?/g;
@aの中身 w439 w 439 so s o z980 z 980 i505 i 505
0657nobodyさん
03/06/27 23:00ID:???$fn =~ s/\W/\0/g;
$fn =~ s/\0/\|/g;
は、一体どういう処理をしているのか判る方いませんでしょうか
0660nobodyさん
03/06/28 04:40ID:???$fn =~ s/\W/\|/g;
じゃないんだろう
0661nobodyさん
03/06/28 04:59ID:???0664nobodyさん
03/06/28 19:23ID:???0665nobodyさん
03/06/29 09:15ID:???0667nobodyさん
03/06/30 16:44ID:???0669nobodyさん
03/06/30 17:12ID:???0670nobodyさん
03/07/03 21:15ID:???0672nobodyさん
03/07/10 13:41ID:???2,143,184という風に3桁ごとにカンマを入れるにはどうしたらいいですか?
おしりからマッチさせることができれば簡単なんですが。
この桁数だと,
/^([0-9]{,2})([0-9]{3})([0-9]{3})$/
を
\\1\,\\2\\3
としたらできるんですが,もっときれいにできる方法を教えてください
0673672
03/07/10 13:50ID:qpJaCER1○ \\1\,\\2,\\3
0676あぼーん
NGNG0677山崎 渉
03/07/15 11:08ID:???__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0678nobodyさん
03/07/15 22:27ID:bkNlTgQn$str =~ s/(^|<br>)>.*?(?=<br>|$)/<blockquote>$&<\/blockquote>/g;
$srt =~ s/<\/blockquote><blockquote>//g;
このような正規表現を書きました。
でもなんかスマートではないので、
上記二つのをまとめて表すにはどうすればいいのでしょうか?
0679nobodyさん
03/07/16 00:28ID:???正規表現してください,お願いします。
0680nobodyさん
03/07/16 00:42ID:???つか何でblockquote?
0683nobodyさん
03/07/16 02:15ID:???0685nobodyさん
03/07/16 22:57ID:???掲示板なんかで、引用符「>」「>」から先の文字の色を変えるにはどうしたらいいですか?
0687679
03/07/17 00:29ID:???0689679
03/07/17 01:28ID:???$line =~ s/^(..)(...)//;を、PHPで使いたいんでどのように正規表現したら、
いいでしょうかということで・・・
0691nobodyさん
03/07/17 02:26ID:???そのperlの文が何をしてるか分かってる?
perl互換の正規表現は preg_* で使えるから、PHPのマニュアルをよく読んでごらん。
0692nobodyさん
03/07/17 09:54ID:???0694679
03/07/17 17:32ID:???0697nobodyさん
03/07/18 10:04ID:qmPObEGpPHP4.2.3-9でタグの外側の文字のみ置換したい
<?
$word = "<a href=\"http://hoge.hoge/bb/\">link Bb</a>";
echo "これを$word<br>\n";
$word2 = "<a href=\"http://hoge.hoge/bb/\">link <b>B</b><b>b</b></a>";
echo "こうしたい$word2<br>\n";
$word = preg_replace("/((?:\G|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);
echo $word;
?>
実行結果は
<a href="http://hoge.hoge/<b>b</b>b/">link <b>B</b>b</a>
になりました。
0698697
03/07/18 10:04ID:qmPObEGp#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
$word = "base bb<a href=\"http://hoge.hoge/bb/\">link Bb</a>bg big";
print "これを$word<br>\n";
$word2 = "<B>b</B>ase <B>b</B><B>b</B><a href=\"http://hoge.hoge/bb/\">link <B>B</B><B>b</B></a><B>b</B>g <B>b</B>ig";
print "こうしたい$word2<br>\n";
$word =~ s/((?:\G|>)[^<]*?)(b)/$1<B>$2<\/B>/ig;
print "$word";
実行結果は
<B>b</B>ase <B>b</B><B>b</B><a href=\"http://hoge.hoge/bb/\">link <B>B</B><B>b</B></a><B>b</B>g <B>b</B>ig
で意図したとおりになりました。
PHPのpreg_replaceはPerl互換なのに、実行結果が異なるのでしょうか?
0699nobodyさん
03/07/18 13:23ID:yTICzsYGhttp://jp.php.net/manual/ja/pcre.pattern.syntax.php
6. Perlの\G言明は、一回のパターンマッチに関するものではないため、 サポートされません。
0700nobodyさん
03/07/18 17:43ID:???0701697
03/07/18 17:49ID:qmPObEGpあれれ。そうなんですか。
PHPでどう書けばいいんだろう。
0702nobodyさん
03/07/18 22:35ID:5012QaLa$word = preg_replace("/((?:^|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);
0703703 ◆jhDfq/C6oU
03/07/21 06:22ID:vOgKMI0a$q1 =~ s/\b1\b/12番目/;
$q1 =~ s/\b2\b/16番目/;
[$q1]が[1]ならば『12番目』を、
[2]だったら『16番目』と置換えたいのですが、
[$q1]が[1]だった時、『12番目16番目』と置換えられてしまいます。
勘違いかもしれませんが、『\b』で境界をやってみても変わりません。
どのようにすると良いでしょうか?
ご教授お願い致します。。。
p.s 条件分岐のほうがいいのでしょうか?
0704nobodyさん
03/07/21 09:20ID:???漏れのところでは動いているが。
$q1 = '0 1 11 12 2 21 22 3 4 5 9';
$q1 =~ s/\b1\b/12番目/;
$q1 =~ s/\b2\b/16番目/;
printf qq($q1\n);
出力
0 12番目 11 12 16番目 21 22 3 4 5 9
0705nobodyさん
03/07/21 18:05ID:???$a[0] = "HyperTextTransferProtocol = HTTP";
$a[1] = "UniversalResourceLocation = URL";
$a[2] = "DataBase = DB";
これらの=より前の部分を大文字にしてスペースで区切って
HYPER TEXT TRANSFER PROTOCOL
UNIVERSAL RESOURCE LOCATION
DATA BASE
と出力させたい。
どなたかご教授願います。
0706nobodyさん
03/07/21 18:21ID:???$a[0] =~ s/([a-z]+)/\1 /g;
print $a[0] . "\n";
$a[0] =~ tr/a-z/A-Z/;
print $a[0] . "\n";
0707706
03/07/21 18:23ID:???foreach ( @a ) {
s/([a-z]+)/\1 /g;
tr/a-z/A-Z/;
}
0708nobodyさん
03/07/21 18:36ID:???0710697
03/07/22 10:45ID:FAepGeTTすごい! 動きました。
ありがとうございます。
■ このスレッドは過去ログ倉庫に格納されています