正規表現道場@2ch Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/24 22:57ID:LrbVcl3Yこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは>>2-5のあたりに。
0753nobodyさん
03/07/30 03:47ID:???漏れも始めのうちは勘違いしてたけど、* とか + とか {n,m} とかは、
「前の文字(列)」の繰り返しじゃなくて、「前の正規表現パターン」の繰り返しだからね。
0754nobodyさん
03/07/30 07:23ID:zn2EBRaLに対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか?
$str =~ s/<table>(^(<table>))*?<\/table>//;
なんて文字列に対するキャレットみたいなのが有ればいいのですが。
$tmp = $str;
while($tmp =~ m|<table>(.*?)</table>|) {
0755途中送信スマソ
03/07/30 07:26ID:???に対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか?
$str =~ s/<table>(^(<table>))*?<\/table>//;
なんて文字列に対するキャレットみたいなのが有ればいいのですが。
$tmp = $str;
while ($tmp =~ s/<table>(.*?<\/table>)/\1/) { }
$str =~ s/$1//;
とするしかないのかな?
0757あぼーん
NGNG0758nobodyさん
03/07/30 11:57ID:xaoebVIFJavaScriptでタグの外側の文字のみ置換したい (IE6)
<html><body><script language="JavaScript">
<!--
//PHP
//$word = preg_replace('/(?:^|(?<=>))([^<]*)/e', "preg_replace('/(b)/i','<b>\\\\1</b>','\\1')", $word);
//Perl
//$word =~ s/((?:\G|>)[^<]*?)(b)/$1<b">$2<\/b>/ig;
word = "base bb<a href=\"http://hoge.hoge/bb/\">link Bb</a>bg big";
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";
document.write("これを"+word+"<br>");
document.write("こうしたい"+word2+"<br>");
result = word.replace(/(?:^|(?<=>))([^<]*)/e,word.replace(/(b)/i,\"<b>$1</b>\")");
document.write(result+"<br>");
//-->
</script></body></html>
正規表現も言語によってまちまちですね。
実行するとまっしろです。。
0760758
03/07/30 13:31ID:xaoebVIF正規表現で構文エラーが発生しました。
(?<=>)がいけないみたいなのですが、なぜでしょう?
0761758
03/07/30 15:17ID:xaoebVIF0763758
03/07/30 16:02ID:xaoebVIFあ、やっぱり。
(?<=を自分で作ってやらないといけないわけね。
0764nobodyさん
03/07/30 16:06ID:???0765あぼーん
NGNG0766758
03/07/30 16:21ID:xaoebVIFうーん --;
別の方法考えたほうが早いかな?
0767あぼーん
NGNG0768nobodyさん
03/07/31 02:36ID:???<a href="c0.html" title="capter0>prologue" target="_blank">
みたいなtagがあったら期待外れの置換をするんじゃないか?
0771nobodyさん
03/07/31 09:42ID:???>は>にしろよ。
って言っても屁理屈こねるだろうから
$word = q|base bb<a href="http://hoge.hoge/bb/" title="capter0>prologue" target="_blank">link Bb</a>bg big|;
$word =~s/(^|<(?:[^<>]*"[^"]*"[^<>]*)*>|<(?:[^<>]*'[^']*'[^<>]*)*>|<[^<>"]+>)([^<]*)
/my $tmp1 = $1; (my $tmp2 = $2) =~ s!(b)!<b>$1<\/b>!ig; $tmp1.$tmp2/xegs;
print $word;
同様にJavaScriptでも
function hoge () {
word = "base bb<a href=\"http://hoge.hoge/bb/\" title=\"2>1\" blank=\"_blank\">link Bb</a>bg big";
re = new RegExp("(^|<(?:[^<>]*\"[^\"]*\"[^<>]*)*>|<(?:[^<>]*\'[^\"]*\'[^<>]*)*>|<[^<>\"]+>)([^<>]+)", "g");
result = word.replace(re,
function test (str, p1, p2) {
re = new RegExp("(b)", "ig");
p2 = p2.replace(re, "<b>$1</b>");
return p1+p2;
}
);
alert(result);
}
0772771
03/07/31 10:27ID:???$word =~s/(^|<(?:[^<>'"]*"[^"]*"[^<>'"]*|[^<>'"]*'[^']*'[^<>'"]*)+>|<[^<>'"]+>)([^<>]*)
/my $tmp1 = $1; (my $tmp2 = $2) =~ s!(b)!<b>$1<\/b>!ig; $tmp1.$tmp2/xegs;
print $word;
function hoge () {
word = "base bb<a href=\"http://hoge.hoge/bb/\" title='\"2>1\"1>1' target=\"_blank\">link Bb</a>bg big";
re = new RegExp("(^|<(?:[^<>'\"]*\"[^\"]*\"[^<>'\"]*|[^<>'\"]*'[^']*'[^<>'\"]*)+>|<[^<>'\"]+>)([^<>]*)", "g");
result = word.replace(re,
function test (str, p1, p2) {
re = new RegExp("(b)", "ig");
p2 = p2.replace(re, "<b>$1</b>");
return p1+p2;
}
);
alert(result);
}
の方が正確か。
0773nobodyさん
03/07/31 10:47ID:???javascript 嫌いだからどうでもいいが
0775nobodyさん
03/07/31 11:31ID:???0776nobodyさん
03/07/31 12:58ID:???5年前の知識をそのまま使ってないか?
0777nobodyさん
03/07/31 20:05ID:???http://www.ne.jp/asahi/minazuki/bakera/html/reference/headmisc#script
0778758
03/08/01 09:15ID:9x/frkaPJavaScriptでも出来るんだ。
RegExp("(^|<(?:[^<>'\"]*\"[^\"]*\"[^<>'\"]*|[^<>'\"]*'[^']*'[^<>'\"]*)+>|<[^<>'\"]+>)([^<>]*)", "g");
これを自分で解析できないってことは、自力なんてとても無理ですね。
あーあ勉強不足。
0779nobodyさん?
03/08/02 00:16ID:lx3eHYOpを入力されたら困るので、英数字といくつかの記号と日本語
(EUC-JPで文字セットはJIS X0208の範囲)だけに限定したいのですが、
/[\w_\-: -(?:\xFE\xFE)/
であってますか?
0780nobodyさん?
03/08/02 01:18ID:???0781nobodyさん
03/08/02 08:54ID:???0782nobodyさん
03/08/05 02:36ID:???↑これってHTMLとかのタグ(+中身)を表すと思ったのですが、間違ってますか?
2ちゃんの適当なスレッドを読み込んで、サクラエディタで空文字""に置換して
txtにしようとすると、置換が永遠に行われ続けます・・。なじぇ?(;´Д⊂
0785nobodyさん
03/08/07 15:09ID:???Perlメモには超長いのが載ってますが・・・
ちなみに自分は、
/[\w\.\-\_]+\@[\w\.\-\_]+\.[a-zA-Z]{2,5}$/
ってやってるんですが・・・
0787nobodyさん
03/08/07 18:00ID:???マッチさせるのってどうやればよいのでしょうか?
0792nobodyさん
03/08/07 19:07ID:???0794nobodyさん
03/08/10 18:11ID:???"<!--[^(-->)]*-->"
じゃないの?(;´Д⊂
0795nobodyさん
03/08/10 18:21ID:???アンカーのアドレスと中身を抽出する正規表現教えて
0796nobodyさん
03/08/10 19:17ID:???そんな質問>>2を読めって言われるだけだ。
まあ可哀想だから回答しといてやる。
>>2嫁。
・おまけ
[^(-->)]←こんな書き方できんぞ。
0797nobodyさん
03/08/10 19:24ID:???0798nobodyさん
03/08/11 22:10ID:???0799nobodyさん
03/08/11 23:28ID:DlYo/nU/為替レートなのですが
こう言う表記がされていて
118と33と38と-0.78を抜き出したいのでつ。
もう一つのパターンが1.1332-37(0.0025)
なのでつが
1.1332と1.1337と0.0025を抜き出したいのでつ。
お願いします。
0800nobodyさん
03/08/11 23:32ID:2ChtRC4J制服姿もよく似合います。パイパン?と思われるほど陰毛が激薄なので
指姦、挿入シーンは注目してみてください!
フェラのテクニックなんかはやっぱり十代のそれとは比べ物になりませんね。
素人援交女の悶絶痴態 !
無料ムービー観てね
http://www.geisyagirl.com/
0801nobodyさん
03/08/12 00:10ID:???$str = '118.33-38(-0.78)';
if ( $str =~/(\d+)\.(\d+)-(\d+)\((\-?\d+\.\d+)\)/ ) {
$str1 = $1;
$str2 = $2;
$str3 = $3;
$str4 = $4;
}
print $str1,"\n";
print $str2,"\n";
print $str3,"\n";
print $str4,"\n";
$str = '1.1332-37(0.0025)';
if ( $str =~/(\d+\.\d+)-(\d+(?:\.\d+)?)\((\-?\d+\.\d+)\)/ ) {
$str1 = $1;
$str2 = substr($str1, 0, length($money1)-length($2)).$2;
$str3 = $3;
}
print $str1,"\n";
print $str2,"\n";
print $str3,"\n";
0802nobodyさん
03/08/12 08:50ID:3acz8emqhttp://www.book-i.net/ad07
0803(^o^)/...http://pleasant.e-city.tv/
03/08/12 21:11ID:P8GdC1tUhttp://pleasant.e-city.tv/
0804nobodyさん
03/08/13 03:36ID:+G82bcJ9メールヘッダを解析するプログラムを作っているのですが、
「
Yahoo!オークション - 自動再出品:---.---(c00000000)
Mime-Version: 1.0」
このようなヘッダのsubject部だけを取り出そうと
$subject =~ s/(.*)\n.+?\:\s*?.+?/$1/s;
こういう正規表現を書きました。
しかし、取り出し結果は
「
Yahoo!オークション - 自動再出品:---.---(c00000000)1.0」
こうなっております。
なぜ、「Mime-Version: 」だけ取れたのか、不思議で仕方ありません。
なぜならば、
$subject =~ s/(.*)(\n.+?\:\s*?.+?)/$1$2/s;
こうやるとしっかりとそのまま出るからです。
空回りしているのは承知ですが、どうか教えてください。
宜しくお願いいたします。
0805nobodyさん
03/08/13 04:07ID:???正規表現の後半の部分が \:\s*?.+? だと最短マッチだから ": " にマッチするから、
"1.0" が残ったんでしょ。
0806nobodyさん
03/08/13 04:18ID:???$subject =~ s/(.*)(\n.+?\:\s*?.+?)/[$1][$2]/;
ところで、正規表現パターンに s オプションがついてるけど、それどゆ意味?
0807nobodyさん
03/08/13 04:38ID:???夜遅くに、本当に有難うございました。
やはり空回りしてましたね。
最後の?をとったらあっさり通りました。
ということは、半角スペースはピリオドでは引っかからないと
いうことですかね。これはこれで今ごろ知りました。やばい。
s オプションをつけたのは、改行が含まれるからです。
これで気兼ねなく眠れます。
本当に有難うございました。
0808nobodyさん
03/08/13 05:02ID:???> ということは、半角スペースはピリオドでは引っかからないと
> いうことですかね。これはこれで今ごろ知りました。やばい。
違うっしょ。
上の例の場合だと、 "\s*?" は最小一致になってるからゼロ文字にマッチして、
空白はその後ろの ".+?" に食べられてるでしょ。
0809nobodyさん
03/08/13 06:33ID:EIv2Ifoyttp://www.yahoo.co.jp/sports/matsui
とあったとします。
それでttp://www.yahoo.co.jpだけを抜き出すにはどうすればいいのですか?
いくらやってもうまくいかなくて。。
0810nobodyさん
03/08/13 07:15ID:???0811nobodyさん
03/08/13 18:17ID:???\sは「空白文字」ですよね?
なので空白文字以外は引っかからないと思うのですが、
いかがでしょう。
理解不足ですみません。
0815山崎 渉
03/08/15 22:34ID:???│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0816nobodyさん
03/08/16 05:13ID:0jlc9p4o例えば <font size=3>font</font> から「font」を検索する場合にfontタグは検索結果に含めないという意味です。
0817nobodyさん
03/08/16 06:07ID:s3eL1VQH0818nobodyさん
03/08/16 07:48ID:w5cGb34cstrip_tags()っていう関数があるけど
0819nobodyさん
03/08/18 02:08ID:BFUuzXu6ただし、最後のスラッシュはいらないです。
たとえば
/usr/local/apache/logs/access_log
このファイルだったら
/usr/local/apache/logs/ ← こうではなく
/usr/local/apache/logs ←このようにしたい
0821820
03/08/18 02:31ID:???の方が良いか。
0823nobodyさん
03/08/18 08:11ID:???.htaccessのRedirectMatchで正規表現を使い以下のような置き換えを
しようとしてるんですが、上手くいきません。アドバイスおながいします
hoge.com/diary/diary.cgi?d=20030818 をhoge.com/diary/?date=20030818
にしたいとき。
RedirectMatch diary\.cgi\?d=(.*)$ http://hoge.com/diary/?date=$1
?は\でエスケープできないのかなぁ。
例えば、
RedirectMatch diary\.cgi\_d=(.*)$
のように、?以外にするとひっかかるし。
あと、置き換え後の
http://hoge.com/diary/?date=$1
に関しては、? が %3f になってしまうのもよくわかりません。。
0824823
03/08/18 08:12ID:???(*)じゃなくって、(.*)ですた。スマソ
■ このスレッドは過去ログ倉庫に格納されています