正規表現道場@2ch Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/24 22:57ID:LrbVcl3Yこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは>>2-5のあたりに。
0558nobodyさん
03/06/15 23:32ID:???#!/usr/local/bin/perl
my $text = 'XXX $bbb XXX $ccc XXX $ddd XXX';
my $dictionary = {
"bbb" => "111",
"ccc" => "222",
};
sub replace_string {
my $dictionary = shift;
my $text = shift;
# $text =~ s/(\$(\w+))/$dictionary->{$2}?$dictionary->{$2}:$1/ge;
$text =~ s/(\$(\w+))/$dictionary->{$2}/ge;
return $text;
}
printf "[%s]\n", $text;
printf "[%s]\n", replace_string($dictionary, $text);
0562nobodyさん
03/06/16 03:58ID:???0564nobodyさん
03/06/16 07:28ID:???マタ〜リしすぎだしこのスレ
0565nobodyさん
03/06/19 09:48ID:zhmAwMLg今現在、<a name="1000</a>になってるソースを
<a name="1000">1000</a>に変更したいのですが
どうすればいいんでしょうか?
ちなみに「1000」の部分は「1」から「1000」までの連番で
<a name="1">1</a>
から
<a name="1000">1000</a>
のようにしたいんです。
ヘンテコな説明ですみません。
0566nobodyさん
03/06/19 10:26ID:???perlの場合はこんな感じかな。(変換前のHTMLが間違ってるけどそれでOKという前提で)
s/(<a name=")(\d+)(<\/a>)/$1$2">$2$3/;
0567nobodyさん
03/06/19 10:51ID:???http://www.2ch.net/
http://www2.2ch.net/
上のすべてに対応するためにはどのように書いたらいいのでしょう?
http://(www\.|www2\.)?2ch\.net/
???
0568nobodyさん
03/06/19 10:56ID:bERWsbmj0572565
03/06/19 21:37ID:???レス遅れてすみません凹
早速、やってみたんですが
思ったように出来ませんでした(>_<)
それと申し遅れましたが、自分
「speeeeeed」というソフト使ってるんですが
このソフトで正規表現を使った置き換えが
出来たらうれしいんです。
わがまま言ってすみません。。
0573nobodyさん
03/06/19 21:45ID:???BREGEXP.DLL導入すれば正規表現使えるって書いてあるから導入すればいいんじゃないのん?
やりかたはHELPに書いてあった。
0574565
03/06/19 21:58ID:???すいません「e」が一個多かったですね^^;
はい、BREGEXP.DLLは導入済みなんですが
正規表現の構文?がわからないので・・・(涙
0576nobodyさん
03/06/19 23:04ID:???0578576
03/06/20 00:11ID:???取り敢えず、簡易ながら
\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+
で落ち着いきたく思うのですが、
ENVの中のHTTP_FROMとかHTTP_SP_HOST内で使うには問題ありませんでしょうかね‥?
0579576
03/06/20 00:13ID:???[\da-zA-Z\-](?:\.[\da-zA-Z\-])+
デス。
0580nobodyさん
03/06/20 00:35ID:???0581nobodyさん
03/06/20 00:55ID:???でも、HTTP_SP_HOSTはHOSTと書いてある時点で入る可能性は否定出来ないのでは?
0582nobodyさん
03/06/20 01:04ID:???0583nobodyさん
03/06/20 01:15ID:???0584576
03/06/20 01:28ID:???[^@]\b([\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+)\b[^@]
これでは対象が先頭から始まる場合、もしくは末尾で終わる場合にマッチしません‥
ダサイ回避策として、検索する文字列に予め先頭と末尾にスペースを入れるという方法がありますが、
正規表現のみで解決する良い手段はないでしょうか???
0585nobodyさん
03/06/20 01:38ID:???入ることはないでしょ。
何が含まれているかわからない中からホストを完璧にマッチさせる
正規表現は不可能だし、メールアドレスもまあまあマッチすれば
いいなら、過去ログであったはず。
0586576
03/06/20 01:44ID:???なんとか自己解決しました。
一応どんなものになったかカキコしておきますね。
(?:^|[^@]\b)([\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+)(?:\b[^@]|$)
0587nobodyさん
03/06/20 01:51ID:???ホスト名にマッチするようにしたら、
メールアドレスにマッチするわけないと思うのだが・・・
0588587
03/06/20 01:53ID:???0591あぼーん
NGNG0592nobodyさん
03/06/21 02:30ID:???<a href="../test/read.cgi/mysv/1044358074/115" target="_blank">>>115</a>
で、URL部../test/read.cgi/mysv/1044358074/115と >> より後の数字を不特定で
マッチさせたいのですがどう表記すればよいでしょうか。お願いします。
0595nobodyさん
03/06/21 11:57ID:NfKIfdiTaaa,"bbb,ccc",ddd
とかも正しく分解できる奴
0596595
03/06/21 12:00ID:???失礼
0597nobodyさん
03/06/22 03:04ID:pHsSEvkKページ内からリンクとリンクを張られた文字を全て取得したいのです
このスレの>>432に似てるのですが、張られた文字も取得したいのです
例えば、<a href="URL">文字列</a>だったら「URL」「文字列」の両方です
自分でもいろいろやってみたのですが、上の例のような形のモノしか取得できません
もう少し、柔軟に取得できるものがいいのですが
preg_match_all ("|<a href=\"([^>]+)\">([^<]+)</a>|U", $contents, $out, PREG_SET_ORDER);
私にはこれが限界です、よろしくお願いします
0598nobodyさん
03/06/22 04:17ID:???<a\s[^>]*?href="((https?|ftp):\/\/[-!\#\$%&'()*+,.\/:;=?\@~\w]+)"[^>]*?>([\s\S]+?)<\/a>
0599597
03/06/22 04:51ID:???ありがとうございます。
できれば下のに対応できるくらい柔軟なものってできませんか?
<a href="http://www.aaa.aaa">通常リンク</a>
<A HREF"http://www.aaa.aaa">タグが大文字</a>
<a href=http://www.aaa.aaa>クォート無し</a>
<a href='http://www.aaa.aaa'>ダブルクォートの代わりにシングルクォート</a>
<a href="./test.html">省略リンク</a>
<a href="ftp://www.aaa.aaa">ftp通常リンク</a>
<a href="https://www.aaa.aaa">https通常リンク</a>
<a href = "http://www.aaa.aaa">イコールをスペースで囲む</a>
< a href="http://www.aaa.aaa">aをスペースで囲む</a>
<a href="http://www.aaa.aaa" aaa="aaa">他要素がある</a>
<a href="http://www.aaa.aaa"><b>他のタグもリンク</b></a>
<a href="http://www.aaa.aaa">aとhrefの間が長い</a>
(最後はわかりやすいよう全角スペースにしてます)
0603nobodyさん
03/06/22 14:27ID:???/* */
からなるコメント文を消すには、どう書けばいいんですか?
0604597
03/06/22 16:22ID:???ちょっとくらい稽古つけてくださいよ
こんな感じで頑張ってはいるんですよ
preg_match_all ("/<\s*a\s[^>]*?href\s*=\s*(?:\"|\'|)([-!\#\$%&()*+,.\/:;=?\@~\w]+)(?:\"|\'|)[^>]*?>([\s\S]+?)<\/a>/i",
$contents, $out, PREG_SET_ORDER);
0605nobodyさん
03/06/22 18:20ID:???「aをスペースで囲む」ってのに対応するのはナンセンスな気がするな。
つーか、正規表現一つで処理せなあかんの?
"#<a[^>]*\shref\s*=\s*(?:\"([^\"]+)\"|'([^']+)'|(\S+))[^>]*>(.+?)</a>#i"
0607603
03/06/22 18:24ID:???<a alt="" href=""> はありえないことが確定してるの?
0608nobodyさん
03/06/22 18:29ID:???0609nobodyさん
03/06/22 20:57ID:???0610nobodyさん
03/06/22 23:44ID:???name = " anchor_id "
HREF = https://www.hogehoge.com/
target = ' _blank '
>
ほ <b> げ </b> ほ <i> げ </i>
</a
>
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;
は、一体どういう処理をしているのか判る方いませんでしょうか
■ このスレッドは過去ログ倉庫に格納されています