トップページ⇒php
825コメント240KB

正規表現道場@2ch Part2

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

リンクなどは>>2-5のあたりに。
0751nobodyさん03/07/30 01:51ID:???
>>750
できました…ありがとうございます。
{2}は00とか88とか同じ数字の連続にしかならないと勘違いしてたようです。
0752nobodyさん03/07/30 03:30ID:???
>>751
それは
(\d)\1
だね
0753nobodyさん03/07/30 03:47ID:???
>>751
漏れも始めのうちは勘違いしてたけど、* とか + とか {n,m} とかは、
「前の文字(列)」の繰り返しじゃなくて、「前の正規表現パターン」の繰り返しだからね。
0754nobodyさん03/07/30 07:23ID:zn2EBRaL
$str= "<table>〜<table>〜</table>〜</table>〜"
に対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか?
$str =~ s/<table>(^(<table>))*?<\/table>//;
なんて文字列に対するキャレットみたいなのが有ればいいのですが。
$tmp = $str;
while($tmp =~ m|<table>(.*?)</table>|) {
0755途中送信スマソ03/07/30 07:26ID:???
$str= "<table>〜<table>〜</table>〜</table>〜"
に対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか?
$str =~ s/<table>(^(<table>))*?<\/table>//;
なんて文字列に対するキャレットみたいなのが有ればいいのですが。
$tmp = $str;
while ($tmp =~ s/<table>(.*?<\/table>)/\1/) { }
$str =~ s/$1//;
とするしかないのかな?
0756754-75503/07/30 08:35ID:???
すいません…>>14に答え有りましたね。
首吊って出直してきます…
0757あぼーんNGNG
あぼーん
0758nobodyさん03/07/30 11:57ID:xaoebVIF
やりたいこと
 JavaScriptでタグの外側の文字のみ置換したい (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>

正規表現も言語によってまちまちですね。
実行するとまっしろです。。
0759nobodyさん03/07/30 12:42ID:???
>>758
perlメモよめ(応用を利かせろって事)
076075803/07/30 13:31ID:xaoebVIF
result = word.replace(/(?:^|(?<=>))([^<]*)/,"test");
正規表現で構文エラーが発生しました。

(?<=>)がいけないみたいなのですが、なぜでしょう?
076175803/07/30 15:17ID:xaoebVIF
JavaScriptでは拡張表現(?が使えない…?
0762nobodyさん03/07/30 15:48ID:???
>>761
使えません。
076375803/07/30 16:02ID:xaoebVIF
>>762
あ、やっぱり。
(?<=を自分で作ってやらないといけないわけね。
0764nobodyさん03/07/30 16:06ID:???
…作れるの?
0765あぼーんNGNG
あぼーん
076675803/07/30 16:21ID:xaoebVIF
>>764
うーん --;
別の方法考えたほうが早いかな?
0767あぼーんNGNG
あぼーん
0768nobodyさん03/07/31 02:36ID:???
しかし>>758のパターン(Perl)だと
<a href="c0.html" title="capter0>prologue" target="_blank">
みたいなtagがあったら期待外れの置換をするんじゃないか?
0769nobodyさん03/07/31 03:34ID:???
>>768
文句だけ言ってコードを示さないヘタレですか?
0770nobodyさん03/07/31 04:07ID:???
>>769
アンタの目には文句に映るのか
ならいい 邪魔したな
0771nobodyさん03/07/31 09:42ID:???
>>768
>は&gt;にしろよ。


って言っても屁理屈こねるだろうから

$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);
}
077277103/07/31 10:27ID:???
$word = q|base bb<a href="http://hoge.hoge/bb/" title='"2>1"1>1' 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;

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:???
いい加減にウザイな。因みに script タグのところに javascript バージョン明示してもダメなのカナ?
javascript 嫌いだからどうでもいいが
0774nobodyさん03/07/31 10:58ID:???
>>773
何に対して書いてるんだ?> javascript バージョン明示
0775nobodyさん03/07/31 11:31ID:???
>>774http://tohoho.wakusei.ne.jp/js/write.htm#language
0776nobodyさん03/07/31 12:58ID:???
もちょっとHTMLを勉強しろよな。
5年前の知識をそのまま使ってないか?
0777nobodyさん03/07/31 20:05ID:???
>>775
http://www.ne.jp/asahi/minazuki/bakera/html/reference/headmisc#script
077875803/08/01 09:15ID:9x/frkaP
>>771
JavaScriptでも出来るんだ。

RegExp("(^|<(?:[^<>'\"]*\"[^\"]*\"[^<>'\"]*|[^<>'\"]*'[^']*'[^<>'\"]*)+>|<[^<>'\"]+>)([^<>]*)", "g");
これを自分で解析できないってことは、自力なんてとても無理ですね。

あーあ勉強不足。
0779nobodyさん?03/08/02 00:16ID:lx3eHYOp
ファイル名をフォームから指定させたいのですが、いたずらで変なファイル名
を入力されたら困るので、英数字といくつかの記号と日本語
(EUC-JPで文字セットはJIS X0208の範囲)だけに限定したいのですが、
/[\w_\-: -(?:\xFE\xFE)/
であってますか?
0780nobodyさん?03/08/02 01:18ID:???
rubyなら/\w/eで日本語もマッチするみたいですね。
0781nobodyさん03/08/02 08:54ID:???
あげあげ
0782nobodyさん03/08/05 02:36ID:???
\<[^<>]*\>

↑これってHTMLとかのタグ(+中身)を表すと思ったのですが、間違ってますか?
2ちゃんの適当なスレッドを読み込んで、サクラエディタで空文字""に置換して
txtにしようとすると、置換が永遠に行われ続けます・・。なじぇ?(;´Д⊂
0783nobodyさん03/08/05 15:13ID:???
>>782

>>2 perl メモよめ
0784nobodyさん03/08/06 14:38ID:???
>>773
タグとりたいんなら<[^>]*>でない?
0785nobodyさん03/08/07 15:09ID:???
みなさん、入力されたメールアドレスの形式チェックって、どのくらい厳密にやってますか?
Perlメモには超長いのが載ってますが・・・

ちなみに自分は、
/[\w\.\-\_]+\@[\w\.\-\_]+\.[a-zA-Z]{2,5}$/
ってやってるんですが・・・
0786nobodyさん03/08/07 17:18ID:???
>>785
smtpに繋いでみる。
0787nobodyさん03/08/07 18:00ID:???
1111111とかaaaaaとか、同じ文字がn文字以上続く場合に
マッチさせるのってどうやればよいのでしょうか?
0788nobodyさん03/08/07 18:14ID:???
>>785
if (/@/) {めーるあどれす}
>>787
1{n,} a{n,}
0789nobodyさん03/08/07 18:23ID:???
>>788
1{n,} 2{n,} 3{n,}・・・
と一つずつ指定していかなければならないのでしょうか?
0790nobodyさん03/08/07 18:28ID:???
>>789
・・・ある1文字を表す正規表現は.(ピリオド)だ。
0791nobodyさん03/08/07 18:59ID:???
>>790
.{n,}だと、aaaaaだけじゃなくabcdeもマッチするのですが・・・
0792nobodyさん03/08/07 19:07ID:???
(.)\1{n-1}
0793nobodyさん03/08/07 19:16ID:???
>>792
ありがとうございます
・・・いや、それも前に試したんですけど
マッチしないとおもったら他の部分間違えてた・・・_| ̄|○
0794nobodyさん03/08/10 18:11ID:???
htmlコメントタグの正規表現教えて下さい。

"<!--[^(-->)]*-->"

じゃないの?(;´Д⊂
0795nobodyさん03/08/10 18:21ID:???
がいしゅつって言われると思うけど
アンカーのアドレスと中身を抽出する正規表現教えて
0796nobodyさん03/08/10 19:17ID:???
>>794-795
そんな質問>>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)
為替レートなのですが
こう言う表記がされていて

118と33と38と-0.78を抜き出したいのでつ。

もう一つのパターンが1.1332-37(0.0025)
なのでつが
1.1332と1.1337と0.0025を抜き出したいのでつ。
お願いします。
0800nobodyさん03/08/11 23:32ID:2ChtRC4J
23歳の割には幼い顔立ちをしている杏奈ちゃん。
制服姿もよく似合います。パイパン?と思われるほど陰毛が激薄なので
指姦、挿入シーンは注目してみてください!
フェラのテクニックなんかはやっぱり十代のそれとは比べ物になりませんね。
素人援交女の悶絶痴態 !
無料ムービー観てね
http://www.geisyagirl.com/
0801nobodyさん03/08/12 00:10ID:???
>>799
$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:3acz8emq
参照
http://www.book-i.net/ad07
0803(^o^)/...http://pleasant.e-city.tv/03/08/12 21:11ID:P8GdC1tU
(^o^)/...
http://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:???
>>806
正規表現の後半の部分が \:\s*?.+? だと最短マッチだから ": " にマッチするから、
"1.0" が残ったんでしょ。
0806nobodyさん03/08/13 04:18ID:???
補足。こうすればどれがどこにマッチしたかわかりやすいかな。

$subject =~ s/(.*)(\n.+?\:\s*?.+?)/[$1][$2]/;

ところで、正規表現パターンに s オプションがついてるけど、それどゆ意味?
0807nobodyさん03/08/13 04:38ID:???
>>805-806
夜遅くに、本当に有難うございました。
やはり空回りしてましたね。
最後の?をとったらあっさり通りました。

ということは、半角スペースはピリオドでは引っかからないと
いうことですかね。これはこれで今ごろ知りました。やばい。

s オプションをつけたのは、改行が含まれるからです。

これで気兼ねなく眠れます。
本当に有難うございました。
0808nobodyさん03/08/13 05:02ID:???
>>809
> ということは、半角スペースはピリオドでは引っかからないと
> いうことですかね。これはこれで今ごろ知りました。やばい。

違うっしょ。
上の例の場合だと、 "\s*?" は最小一致になってるからゼロ文字にマッチして、
空白はその後ろの ".+?" に食べられてるでしょ。
0809nobodyさん03/08/13 06:33ID:EIv2Ifoy
質問なんですが、たとえば
ttp://www.yahoo.co.jp/sports/matsui
とあったとします。
それでttp://www.yahoo.co.jpだけを抜き出すにはどうすればいいのですか?
いくらやってもうまくいかなくて。。
0810nobodyさん03/08/13 07:15ID:???
(ttp://[^/]*)
0811nobodyさん03/08/13 18:17ID:???
>>808
\sは「空白文字」ですよね?
なので空白文字以外は引っかからないと思うのですが、
いかがでしょう。
理解不足ですみません。
0812nobodyさん03/08/13 21:01ID:???
>>810
???
0813nobodyさん03/08/13 23:02ID:???
>>811
ありゃ、漏れの方が空回りしてたかな。その通りです。
0814nobodyさん03/08/13 23:32ID:???
>>813
なんか不思議ですよね。
個人的に非常に気になるところです
0815山崎 渉03/08/15 22:34ID:???
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0816nobodyさん03/08/16 05:13ID:0jlc9p4o
phpなんですがある文字列を検索するときにタグを検索対象外にするにはどうすればいいんでしょうか?
例えば <font size=3>font</font> から「font」を検索する場合にfontタグは検索結果に含めないという意味です。
0817nobodyさん03/08/16 06:07ID:s3eL1VQH
http://esenden.com/rank/ninki/ranklink.cgi?id=groovy
0818nobodyさん03/08/16 07:48ID:w5cGb34c
>>816
strip_tags()っていう関数があるけど
0819nobodyさん03/08/18 02:08ID:BFUuzXu6
フルパスからディレクトリ名を得る正規表現を教えてください。
ただし、最後のスラッシュはいらないです。
たとえば

/usr/local/apache/logs/access_log

このファイルだったら

/usr/local/apache/logs/    ← こうではなく
/usr/local/apache/logs     ←このようにしたい
0820nobodyさん03/08/18 02:30ID:???
>>819

s{/[^/]+$}{};
082182003/08/18 02:31ID:???
s{/[^/]*$}{};

の方が良いか。
082281903/08/18 02:32ID:???
>>820-821
たいへん参考になった
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 になってしまうのもよくわかりません。。
082482303/08/18 08:12ID:???
うわ、間違えた。
(*)じゃなくって、(.*)ですた。スマソ
0825nobodyさん03/08/18 13:30ID:???
>>823
DirectoryIndex diary.cgi
という手もあるが、RFC2606 嫁とも云いたくなる(w
■ このスレッドは過去ログ倉庫に格納されています