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

正規表現道場@2ch Part2

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

リンクなどは>>2-5のあたりに。
0002nobodyさん02/11/24 22:58ID:???
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
0003nobodyさん02/11/24 23:00ID:???
前スレ
正規表現道場@2ch
http://pc.2ch.net/test/read.cgi/php/996105815/
0004nobodyさん02/11/25 00:15ID:oyWFxt5H
パターン集みたいなのは無いですか?
コード書く度に思い出すはめんどい。ていうか忘れてる。
0005あぼーんNGNG
あぼーん
0006Name_Not_Found02/11/29 22:13ID:/ULd/3Z0
age
0007nobodyさん02/12/05 05:07ID:5X+JpwfG
perlのcgiですけど、正規表現の置換でこれを含む語は置換したくないっていう時は
どうやるんでしょうか?
例えばテキスト中の「パーマン」は全部「プーヤン」に置換したいんだけど、
「パーマン3号」だけはスルーする、という風にするには。

一度全部「プーヤン」に変換してから「プーヤン3号」から「3号」を取る、
という方法しかないんでしょうか?お願いします。
0008nobodyさん02/12/05 05:28ID:???
>>7
こうかな。
$str =~ s/パーマン(?!3号)/プーヤン/g;
0009nobodyさん02/12/05 06:15ID:5X+JpwfG
ありがとうございます、でも駄目でした、、、(;´Д`)

やりたいことは掲示板にurlを書くと自動リンクになるようにしたいんですけど、
後で修正しようとすると先ほど自動で貼ったアンカータグの中のurlも、
そのアンカータグで囲まれたurlにも再度アンカータグを貼ってしまいます。
(?!3号)みたいにして括弧で囲んで?!を付ければ無視されるのかなと思い、
$comment =~ s/(?!<a href=\")(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!<\/a>)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
としてみたのですが無理でした。
説明不足ですいません。
0010Name_Not_Found02/12/05 06:32ID:???
修正するときって普通元データを弄るんじゃないのかね?
0011nobodyさん02/12/05 07:02ID:5X+JpwfG
そうです、元データをテキストエリアに読み込んでくるんです。
それを修正します。
0012nobodyさん02/12/05 07:44ID:???
>>10
すいません、質問の意味がわかりました。
cgiで表示させるだけなら、その時にだけ自動リンクを使えばいいですよね、
でも一日ずつhtmlファイルで保存してそれを読み込んでくるタイプなので、
元ファイルにすでにアンカーが貼られてるんですよ。
だからそれを修正しなければならない、とこういうわけです。
掲示板というよりニュースサイトのようなものを作ってます。
00131202/12/05 07:47ID:???
間違った。

× アンカー
○ <a href=""></a>
0014Name_Not_Found02/12/05 08:16ID:0NYAnUxi
というと、こんな感じの運用?

一日目:
これすごい http://www.aaa.com/article.pl?id=11

二日目:
<a href="http://www.aaa.com/article.pl?id=11">これすごい</a>
もっとすごいの発見 http://def.ghi.com/?bbs=a

三日目:
<a href="http://www.aaa.com/article.pl?id=11">これすごい</a>
<a href="http://def.ghi.com/?bbs=a">もっとすごいの発見</a>
....

以前の記事を修正しないなら、
追加分の生データだけパースして html に追加してく処理考えたほうがいいと思う。

で、アンカータグの中身、というよりタグの中身を処理対象外にする方法は
http://www.din.or.jp/~ohzaki/regex.htm を参照。
00151202/12/05 10:00ID:5X+JpwfG
>14
ありがとうございます、やりたかったのは確かにそんな感じです。
正確には、

一日目
これすごい http://www.aaa.com/article.pl?id=11

二日目:
これすごい <a href="http://www.aaa.com/article.pl?id=11">http://www.aaa.com/article.pl?id=11<;/a>
もっとすごいの発見 http://def.ghi.com/?bbs=a

といった感じです。
で、その大崎さんという方のサイトを見て修正したのですが、
確かにタグの中のurlはそのままになったんですが、タグに囲まれたurlの方が
修正するたびに二重に<a href></a>で囲まれていきます(;´Д`)。
<a href>と</a>の間にあるもの以外を全て置換しろ、という正規表現が書ければいいのですが
自分の力量ではとても、、、。
難しいです。
00161202/12/05 10:05ID:???
あれ?何か二日目に余計な&lt;/a&gt;っていうのがついちゃった。
0017nobodyさん02/12/05 10:20ID:???
s/(?<![">])(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!["<])/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
0018Name_Not_Found02/12/05 10:45ID:0NYAnUxi
>>15
それはもう処理の内容を考え直した方がいいと思われ。
基本的に追加なんだろうし。
html をこんな風にして、

<!-- news here -->
これすごい <a href="...">...</a>

で、追加分を html に変換後、
出力ファイルの <!-- news here --> をサーチして追加分をそこに足す、
みたいなやりかたはどう?

過去記事も頻繁に修正する可能性があるなら元データを残すやり方にするべき。
もっとも、リクエスト毎に html に変換するんではなく、
スタティックな html をあらかじめ作っておくってやり方はそのままでいいと思う。
0019Name_Not_Found02/12/05 10:48ID:???
実際、複雑すぎる正規表現は速度とメンテナンス性を低下させるし。

0020nobodyさん02/12/05 17:44ID:???
>17
それじゃ<br>が入ってる場合は最初の行しか置換されないし、
その最初の行も最後の一文字が無視される罠。
00211202/12/05 19:13ID:5X+JpwfG
すいません、遅れました。
今17さんのでやってみたのですが、確かに20さんがおっしゃるような結果が出てしまいました。
あと、メールアドレスが置換されないみたいです。

>15
まさにそのやり方です、<!-- news here -->のようなコメントをサーチする。
ただ、僕は修正がすごく多いです、、、。
元データを残すやり方は、人様のスクリプトを改良してるので
一からやり直しになるし、またバージョンアップ版が出た時の互換性とか考えると
ツライですねぇ。
もちろん、著作権表示と改造表示は出してます。
00221202/12/05 19:37ID:???
失礼、>15ではなくて>18でした
0023nobodyさん02/12/06 00:05ID:0LEQc9+/
>>12
とりあえず10分ほどやってみたが出来なかった、
ウチの上司なら出来ると思うが昨日から出張‥‥
0024nobodyさん02/12/06 00:14ID:???
未だに意味がわからねぇw

一旦アンカータグ消せばいいんジャネーノ?的外れ?
0025nobodyさん02/12/06 00:40ID:???
>>24
修正用のテキストエリアに読み込む時に、元ファイルが例えば

<a href="http://www.yahoo.co.jp/">http://www.yahoo.co.jp/<;/a>

こういうのばっかだったらそれでいいかも知れんが、実際は

<a href="http://www.yahoo.co.jp/">これヤフー</a>

みたいのも混ざってるってことでしょ。
0026nobodyさん02/12/06 00:42ID:???
2chだせぇ
0027Name_Not_Found02/12/06 03:26ID:N6C9SdnH
じゃあ、こうするのは?
追加と修正は別フェイズにするの。

修正時は余計な変換処理無しで html を直接弄って、
追加の時は追加分だけ変換処理して <!-- news here --> につっこむの。

ただ、直接 html 弄れるフォームがあるってのは
心理的に好きじゃないなぁ。

なんだか正規表現と関係なくなってきたなぁ…
0028nobodyさん02/12/06 05:06ID:???
すいません、もともと正規表現についてはよくわからなかったので、とりあえず
「変数$newsの中から、アンカータグの中のものと、アンカータグに囲まれた部分は
無視してそれ以外を置換する」
ということがサクっと簡単に出来るものだと思ってました。
長く引っ張ってしまって申し訳ないです、正規表現、一から出直して勉強してきます。
0029nobodyさん02/12/06 12:37ID:???
$msg =~s{<a href="<a href=".*?">(.*?)</a>">}{<a href="$1">}g;
$msg =~s{<a href=".*?"><a href=".*?">(.*?)</a></a>}{<a href="$1">$1</a>}g;
0030Name_Not_Found02/12/06 14:31ID:???
>>29
そういう処理しなきゃいけない状況が不毛なんだってば。
0031nobodyさん02/12/06 16:16ID:???
>>21
全部一から自分で作ればいいじゃん。
0032nobodyさん02/12/06 16:19ID:???
>>30
質問に答えて何か問題があるのか?
0033Name_Not_Found02/12/07 04:46ID:705rdiGC
>>32
おばかなプログラムが増えていく状況を助長してはいけません。
「ライトついてますか?」でも読んでくれ。
0034nobodyさん02/12/07 07:33ID:???
>>33 あっそ。死ねよ。
0035Name_Not_Found02/12/07 11:04ID:???
>>34 幼いね。
0036nobodyさん02/12/08 12:52ID:???
オリジナルタグみたいなモノを使えるようにしているのですが

<code></code>で囲んだ間は、オリジナルタグを無効になるように処理したいです。
でも、<code>〜</code>〜</code>こういう風に書かれたら
途中で終わってしまて困ってます。

どうしたら良いでしょうか?
0037nobodyさん02/12/08 12:59ID:???
>>36
オリジナルタグってなに?

無効にするってどうすることを無効とするの?
00383602/12/08 13:40ID:???
すみません、説明不足でした。

簡単に言うと、
<code>〜</code>hogehoge</code>
これを
<blockquote>〜</code>hogehoge</blockquote>
こうやって置き換えをしたいのですが、

<blockquote>〜</blockquote>hogehoge</code>
になってしまいます。

s/<code>(.*?)<\/code>/i;
$t =$1;
$t =~ /</&lt/i;
$t =~ />/&gt/i;
s/<code>(.*?)<\/code>/<blockquote>$t</blockquote>/i;

ソースはこんな感じです。どうしたらいいでしょう…
0039nobodyさん02/12/08 14:16ID:???
>>36
>こういう風に書かれたら
っていうことはユーザーの入力を処理するってこと?
それならまずタグの閉じ忘れチェックをすればいいんじゃないかな。
00403702/12/08 15:01ID:???
@conv{qw(< >)}= ('<', '>');
s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;
00413702/12/08 15:03ID:???
しっ、失敗・・・ りとらい

@conv{qw(< >)}= ('&lt;', '&gt;');
s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;
0042nobodyさん02/12/08 15:05ID:???
$t = '<code>〜</code>hogehoge</code>';
$t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i;
print $t ;

これでどうよ?
0043nobodyさん02/12/08 15:09ID:???
あ、<と>も置換するのね。
その辺は適当に読み直してくれといいつつ書いてみる。。

$t = '<code>〜</code>hogehoge</code>';

$t =~ /</</i;
$t =~ />/>/i;
$t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i;
print $t ;

間違ってたらごめんよ。
0044nobodyさん02/12/08 15:13ID:???
$t = '<code>〜</code>hogehoge</code>';

$t =~ /</&lt;/g;
$t =~ />/&gt;/g;
$t =~ s/&lt;code&gt;(.*)&lt;\/code&gt;/<blockquote>$1<\/blockquote>/i;

痛いな、漏れ。
0045Name_Not_Found02/12/08 17:44ID:cySwFV0O
<code>あああ</code>ほげ<code>ほげ</code>ふがふが</code>
とかの場合、どこからどこまでが blockquote?

どういうシチュエーションなのかよくわからんちん。
textarea に書き込まれた文字を処理するのか
テンプレートファイルでの処理用のタグを導入してるのか…
0046nobodyさん02/12/08 17:51ID:???
>>45
なにも考えずに正規表現を書き、
足りない部分は脳内補完、
がこのスレの主旨・・・なのか?
0047Name_Not_Found02/12/08 18:00ID:cySwFV0O
なんか、ここ最近の流れみてるとそうらしいですね。
指摘すると切れるし。
0048nobodyさん02/12/08 18:26ID:???
単に質問の仕方が悪いだけだろうよ。
0049Name_Not_Found02/12/09 06:04ID:7ZfXL1H9
まあ脊髄反射で答えるのは双方のためにならんってこった。
0050nobodyさん02/12/09 11:29ID:N8zphpYN
整数と小数を許可する正規表現を書きたいと思って
↓を書いてみました。

^[0-9]*\.{1}[0-9]$

でも、これだと必ず小数点を書かないといけません…。
例えば「12」という数値を通したい場合
「12.0」にしないとエラーになってしまうのです。
「12」でも通るようにするためにはどう書けば良いのでしょうか。
0051nobodyさん02/12/09 11:50ID:???
^-?\d+(?:\.\d+)?$

.1 の形式を許可するなら

^-?\d+(?:\.\d+)?|\.\d+$
00525002/12/09 12:07ID:???
負数も許可したくなかったので

^\d+(?:\.\d+)?$

とすると希望の動作しました!ありがとうございます。
00535002/12/09 12:31ID:N8zphpYN
先ほど教えていただいた
^\d+(?:\.\d+)?$
これを丸々否定したいのですが、

^[^\d+(?:\.\d+)?]$

だとダメでした。
どのようにすれば良いでしょうか…。何度もスイマセン。

何がやりたいかというと、とあるcgiでの入力チェックを行う際に
「有効書式設定」「無効書式設定」というのがあります。
そこにフォームからの入力チェックを正規表現で設定できるのですが、
「有効書式設定」に先ほどの正規表現を入力すると
必ず入力しなくてはならなくなりました。
ですので「無効書式設定」に先ほどの正規表現を
丸々否定したものをすれば、必ず入力しなくても良くなるのでは
と思って質問させていただいてます。
0054nobodyさん02/12/09 13:39ID:???
>>53
!~ /^\d+(?:\.\d+)?$ /
00555002/12/09 17:05ID:N8zphpYN
>>54
許可したくないものまで許可できてしまいました…。
ですので、「整数と小数、または、0文字を許可」という条件を
「有効書式設定」の所に設定し直そうと思います。
整数と小数の部分は
^\d+(?:\.\d+)?$
でいけてるのですが「または、0文字を許可」の部分を
↑にどのように付け加えればよいのかわかりません。。
すいませんがよろしくお願いします。
0056Name_Not_Found02/12/09 17:29ID:Pf18ytiH
>>55
0文字を許可を入れる場合の定石は、
処理ループの(ループだよね?)最初で /^$/ 等でマッチさせる。

一つの正規表現でやるよか速くなる可能性高いからそっちも考えて。

"または" がきたら、普通に if とかの使用も考えること。
00575502/12/09 17:40ID:N8zphpYN
>>56
今回、cgiそのものを書いているのではなく
cgiを設定する画面が存在して、その「有効書式設定」部分に
正規表現を書けば、自動的に入力チェックを行ってくれるというものです。

         ┌―――――――┐
有効書式設定:|         |
         └―――――――┘

cgiのこのテキストボックスに書くって感じです。
なので、一つの正規表現で解決させたいです。。
0058Name_Not_Found02/12/09 17:48ID:???
>>57
なるほど。でしたら、

^(?:\d+(?:\.\d+)?)?$

で。

.0123 とかを許可するんだったら

^(?:\d+)?(?:\.\d+)?$

で。
00595702/12/09 18:19ID:???
>>58
ありがとうございます!!!
これでばっちりです!
本当に助かりました…。
00603602/12/09 18:50ID:???
遅くなってスミマセン。

>>37,42,45
ありがとうございました、無事変換できました。
つまり、?が要らなかったんですね。

<code>あああ</code>ほげ<code>ほげ</code>ふがふが</code>

つまり、最初と最後の<code></code>のみを変換して、
間に入っているタグは無効にしたかったんです。

かなり悩んでいたので、助かりました。感謝です!
0061nobodyさん02/12/09 23:44ID:???
ところで、37さんのと44さんのではどちらが効率が良いのでしょうか?
0062nobodyさん02/12/10 03:45ID:???
perlの正規表現でhttp://〜を<a href〜>つけてリンクにするのは
どんな表現方法が一番いいのでしょうか?
0063nobodyさん02/12/10 06:27ID:QO7zNhpw
すいません、複数の語句に対してマッチするかどうかしらべてるんですけど
何に対してマッチしたかがわかりません。
例えば

if($ref=~ /ああ/ || $ref=~ /いい/ || $ref=~ /うう/ || $ref=~ /ええ/){
$ref=さっきマッチした語句 , "おお";
}

みたいな処理をする場合、さっきマッチした語句を調べるにはどうしたらいいのでしょうか?
$_ とか$1を当てはめても上手くいかないんですが。
お願いします。
00646302/12/10 06:34ID:???
$&ですね、逝ってきます‥‥
0065nobodyさん02/12/10 07:37ID:???
「format2ちゃんねる&hc=0&hs=0」
みたいなフォーマットの文を
この例では「2ちゃんねる」に当たる部分だけ抜き出したいので

$text=2ちゃんねる&hc=0&hs=0;
$text =~ /format(.*)\&(.*)/:
$hensu=$1;

みたいに書くと、$hensuの中身が
「2ちゃんねる&hc=0」という風に
一番最後にある「&」で区切られてしまいます。
最初に出くわした「&」で区切りたい、という時にはどうしたらいいんでしょうか?



0066nobodyさん02/12/10 07:51ID:???
置き換えに関して質問なのですが
[→&#91;
]→&#93;
と言う風に置き換えをしたいのですが、下記のようにすると

$msg =~ s/\Q[\E/?/g;
$msg =~ s/\Q]\E/?/g;

ー の文字コードが81 5Bで、 [ の文字コードが5Bなので
ー が文字化けをしてしまいます。

文字コードはShift_JISです。どういう風にすれば文字化けを回避できるでしょうか?
0067Name_Not_Found02/12/10 10:17ID:SHy7dsCG
>>65
.* とか .+ は最も長くマッチしようとします。
.*& ってやると後ろの & まで見ちゃうわけですね。
そういう場合は .*? みたいに、後ろに ? を付けると
なるべく短かくマッチしようとするようになります。

>>66
前の文字が Shift JIS の 1byte目じゃなければ置換、ってすればいいのかな。

s/(?:(?:^|[^1byte目の範囲を書いてね])\[)/?/g;

試してないからわからないけど、これでどうでしょう?
0068Name_Not_Found02/12/10 10:18ID:???
>>67
括弧余計すぎた。
そと側の (?: .. ) はいらないわな…
00696502/12/10 10:46ID:???
>>67
ありがとうございます、理解できました。
0070Name_Not_Found02/12/10 11:42ID:SHy7dsCG
>>69
ただ、.*? は遅くなることがあるから、
この場合は [^&]*& の方が望ましいです。
0071nobodyさん02/12/10 12:21ID:???
http://〜〜〜〜 のURLを検出する正規表現で
速いのってどんなやつ?
kentでは
$test =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target=\"_top\">$2<\/a>/g;
ってやってるみたいだけど これ遅くない?
0072nobodyさん02/12/10 12:26ID:???
>>71
([^=^\"]|^)って何? いらないんじゃ……
0073nobodyさん02/12/10 12:29ID:???
>>71
シラソ
kentのやつみたらそうなってた。

多少曖昧でもいいから速いマッチング方法キボン
00747202/12/10 12:44ID:???
最初の部分はすでにA要素がある場合の対策かな。
それを削ってこんな感じ。
$test =~ s/(https?\:\/\/[a-zA-Z\.\~\-\/\?\&\=\@\;\#\:\%_!*'()]+)/<a href=\"$1\">$1<\/a>/g;
ちなみに、[]内はURI使える文字だけど、kentのは不足している。
動作確認していないので、フォローよろしく。
00757202/12/10 12:59ID:???
ごめん、0-9抜けてた。\のいらない記号もあると思う。
$test =~ s/(https?\:\/\/[-a-zA-Z0-9.~\/?&=\@;#:%_!*'()+\$,]+)/<a href=\"$1\">$1<\/a>/g;
0076nobodyさん02/12/10 14:39ID:???
$test =~ s/(https?\:\/\/[\S]+)/<a href=\"$1\">$1<\/a>/g;
ではダメ?
00777602/12/10 14:41ID:???
'<''>'は排除しなきゃか・・・
00787602/12/10 14:44ID:???
$test =~ s/(https?\:\/\/[\S<>"']+)/<a href=\"$1\">$1<\/a>/g;
かな?
00797602/12/10 14:45ID:???
$test =~ s/(https?\:\/\/[^\s<>"']+)/<a href=\"$1\">$1<\/a>/g;
だ・・・鬱
0080nobodyさん02/12/10 15:03ID:???
>>49
00817602/12/10 15:19ID:???
>>80
御意
0082nobodyさん02/12/10 16:26ID:???
>>76
日本語もリンクするのか?
0083nobodyさん02/12/10 16:33ID:???
>>82
2バイト文字を使うウマシカに付ける薬によいのでは?(w
0084nobodyさん02/12/10 16:45ID:???
多国語ドメインがRFCになるとURLの切り出しがウザそう
0085Name_Not_Found02/12/10 17:02ID:???
>>84
それよか、IRIなんてのがひかえてますよ。
00866602/12/10 22:19ID:???
>>67
ありがとうございます。1バイト目の文字は
\x81-\x9F\xE0-\xFC
ですが、その通りにしてもなぜか>が消えてしまうようです???
例えば<BR>の次に[が来ていると、
<br? こうなってしまいます。

もしかして、s/(?:^|[^1byte目の範囲を書いてね])\[/?/g;
この場合、Shift_JISの1バイト目の文字以外が来たら、
その文字と[を?の文字に変換してしまうのではないでしょうか?

見当違いならすみません・・・
0087nobodyさん02/12/10 22:27ID:???
s/(?=[\x81-\x9F\xE0-\xFC])\[/&#91;/g;

これだと、上手くいったような気がします。
>>67さん、ありがとうございました!
00886602/12/10 22:29ID:???
と思ったらエスケープされてませんでした・・・
0089nobodyさん02/12/10 23:02ID:???
if ($hoge ne 'bookmark' && $hoge=~ /(?:(?!cache).)*/) {

$hogeが'bookmark'だとちゃんと弾くけどcacheが入ってる場合に弾いてくれない。
http://www.din.or.jp/~ohzaki/regex.htm#Without
ここのやつの意味を勘違いしてるのかなぁ。
0090nobodyさん02/12/10 23:22ID:???
/^(?:(?!cache).)*$/
0091nobodyさん02/12/10 23:37ID:???
>>90
ありがとうございます出来ました。
0092Name_Not_Found02/12/11 01:43ID:61zg/eqG
>>86
ああああ、ごめんなさい。
たしかに、1byte目が消えちゃいますね。
()で$1に保存するか、look-behind 正規表現を使えばいいのかな。
(?=...)の look-ahead はそういうケースでは駄目なはず。

$1 の方は、

s/(^|[^範囲])\]/$1&#91;/g

でいいはず。

look-behind は

s/(?<![範囲])\]/$1'amp;#91;/g

かな。こっちは Perl のバージョンが古いと使えない。5.6 あたりなら大丈夫。
00936602/12/11 08:02ID:???
>>92
lookbehindを使えば良かったんですね!
何度もありがとうございました。
0094 02/12/11 17:44ID:YVHUV6QH
質問します。言語はperlです。

>>94という具合に
ページ内にリンク先がある場合に限ってリンクを張りたいのですが
どうしたらいいでしょうか。

【悪い例】
$foo=">>1 hogehoge\n>>2 hogehoge\n"; #置換対象文字列
$num="94"; #最新レスの番号
$max="100" ; #1ページあたりの表示件数

if(($num>$2)&&($2>$num-$max)){
$foo =~ s/(>>)([1-9][0-9]*)/<a href="#$2">$1$2<\/a>/g;
}

置換以前の$2では当然うまくいきませんです。
しかも、置換対象が2つ以上ある場合はどうしたらいいのでしょうか。
00959402/12/11 17:49ID:YVHUV6QH
$foo =~ s/(&gt;&gt;)([1-9][0-9]*)/<a href="#$2">$1$2<\/a>/g;
でございます。
0096Name_Not_Found02/12/11 18:06ID:7uJNDqfw

my $max =100; # これは range で
my $num =94; # こっちが max の方がいいような気もするけど。

my $foo=<<EOB;
>>1 hogehoge
>>2 hogehoge
EOB

my ( $high, $low ) =( $num, $num - $max );

$foo =~s/(?:>>)(\d+)/
$low <= $value and $value <= $high ? qq(<a href="#$1">>>$1</a>)
: qq(>>$1) /sge;
00979602/12/11 18:08ID:???
ミスッた。
$value ってなんじゃ…
$1 ね。
00989402/12/11 18:11ID:YVHUV6QH
>>96 早速ありがとうございます。やってみます。
00999402/12/11 18:49ID:YVHUV6QH
なぜかうまくいきません。
恐れながら、$1は、>>にマッチするのではないですか?
すみません教えてください。
01009602/12/11 20:29ID:7uJNDqfw
>>94
(?:..) は $1..9 に値を保存しません。
なので $1 で問題ないです。

動かなかった理由は / がクォートされてなかったのと
置換文字列を一行に纒めなてかったからのようでした。
なので、s/// の替りに s{}{} を使っときます。


my $max =100; # これは range で
my $num =94; # こっちが max の方がいいような気もするけど。

my $foo=<<EOB;
>>1 hogehoge
>>2 hogehoge
EOB

my ( $high, $low ) =( $num, $num - $max );

$foo =~s{(?:>>)(\d+)}{
$low <= $1 and $1 <= $high ? qq(<a href="#$1">>>$1</a>)
: qq(>>$1) }sge;
01019602/12/11 20:31ID:7uJNDqfw
というか (?:...) を使う意味ないじゃんね…
意味無いんで外しといてください。
01029402/12/12 00:14ID:pDUwoT6Y
ありがとうございました。
0103nobodyさん02/12/24 22:43ID:???
http://pc.2ch.net/test/read.cgi/php/996105815/961
0104名無しさん03/01/03 00:29ID:yu7P73hS
すいません 教えてください。。 
最短マッチが、いろいろ読んだけどわかりません。phpです。

/* hoge */ hogehoge /* hoge */  の /* */
で囲んだ部分だけ灰色にしたいんです。

ereg_replace("(/\*.+\*/)","<font color=\"gray\">\\1</font>");
こうすると 最初と最後の/* */にマッチしてしまいます。

たぶん、最長マッチだからです。
最短マッチにするには?をつけろと書いてあるけど、どこにつけるかわかりません。

(/\*.+\*/){1,}? こうするとなにも出てきません。

なんか基本的なことがわかってないです。
0105nobodyさん03/01/03 00:46ID:nupLg+Ov
.*?
010610403/01/03 01:09ID:yu7P73hS
/\*.*?\*/ ということでしょうか? なんもでてこないです(;_;)
010710403/01/03 01:23ID:yu7P73hS
/\*.+?\*/ でもでてこないです。なんか勘違いしてるのでしょうか
教えてください・・・
0108nobodyさん03/01/03 01:27ID:nupLg+Ov
うぅーそれ以上はわからない・・

もしかしたらereg()で最短一致は使えないのかも。
preg_replaceでなら上手くいくかも。
010910403/01/03 01:40ID:yu7P73hS
ありがとうございます・・
でもpregでもできません・・(;_;)
というか、なにも表示されないというのがアヤシイです。。
0110nobodyさん03/01/03 01:41ID:???
そんなあなたにPerlをお奨めしますです。。。
0111nobodyさん03/01/03 17:38ID:???
$hoge=$1 if($text=~/(ソ+)/);

このように書いてもソが脳内通りに取得出来ないんですが
どうすればいいんでしょうか?
0112nobodyさん03/01/03 21:33ID:nupLg+Ov
$hoge=$1 if($text=~/((?:ソ)+)/);
011311103/01/04 17:33ID:???
>>112
無事成功しました。
ありがとうございました。
0114山崎渉03/01/15 13:36ID:???
(^^)
0115nobodyさん03/01/18 13:42ID:???
掲示板スクリプト作っているんですが、
URLの抽出前に<>"を文字参照に置き換えると、
URLの抽出を行うと、http://www.yahoo.co.jp">Yahoo</a>
とかもa>までURL扱いになってしまい、困っています。

$msg=~s/(http|ftp|mailto)\:([\w.\@~\/\-\?&=;%#]+)/\<a href=\"$1:$2\">$1:$2<\/a>/g;

URL抽出部分はこんな感じです。
0116nobodyさん03/01/18 13:45ID:hA2YqZMs
変な日本語ですみません。頭がボーとしてて・・・
0117nobodyさん03/01/18 15:29ID:???
>>115
じゃあ、抽出後に<>を置き換える。
後、$1と$2、どうせ結合するならまとめて括弧でくくればいいのに。
011811503/01/18 18:54ID:???
>>117

>じゃあ、抽出後に<>を置き換える。
抽出後に<>を置き換えると、
<aまで&lt;aに置き換わってしまうので・・・

>まとめて括弧でくくれば
そうですね。

で、一旦[link]http://www.yahoo.co.jp[/link]に置き換えてから、
<>を置き換えて、[link]...[/link]を置き換えるというもの考えたんですが、
それだと
=~/\[link\](.*)\[\/link\]/\<a href=\"$1\">$1\<\/a\>/g;
等としても、最初の[link]から最後の[/link]までが置き換わってしまって、
2つlinkが続く場合等に予期しない結果になってしまいます。
0119nobodyさん03/01/18 19:01ID:???
>>118
俺ならタグ付けは表示時に行う。データに妙な情報付けたくないんで。
012011503/01/18 19:23ID:hA2YqZMs
>>119
表示時にタグ付けすると解決する?
0121nobodyさん03/01/18 19:30ID:???
>>120
そだろ。
012211503/01/18 19:33ID:???
でもデータは
&lt;a href=&quot;http://www.yahoo.co.jp/&;quot;&gt;Yahoo&lt;/&gt;
とかになるわけで・・・
0123nobodyさん03/01/18 19:38ID:???
>>122
なんでやねん。

データ:
http://www.2ch.netって死ぬほどおもしれー!

表示:
<a href="http://www.2ch.net">http://www.2ch.net<;/a>って死ぬほどおもしれー!
012411503/01/18 19:47ID:???
違う違う。ユーザが、
<a href="http://www.yahoo.co.jp/">Yahoo!</a>
と投稿した場合。
char str[]="http://www.yahoo.co.jp/";
等でも同じ。(この場合はco.jpの後の"もリンク扱いされてしまう)
0125nobodyさん03/01/18 19:51ID:???
>>124
やめさせろ。以上。
0126nobodyさん03/01/18 19:54ID:???
>>124
<.*?(\"([^\"]+?)\".*?)*..?>
0127nobodyさん03/01/20 08:07ID:vz/F/uwh
http://www.2ch.net/ でも http://2ch.net/ でもマッチする
一番エレガントな書き方ってどういうのですか?あと
$url = 'http://www.2ch.net/';
$url =~ s/2ch/1ch/;
と書いた場合になんで$url のなかの"/"をエスケープしなくても
エラーにならないんでしょうか?
0128nobodyさん03/01/20 08:08ID:???
>>127
http\/\/:[www\.]?2ch\.net\/
0129nobodyさん03/01/20 08:09ID:???
ごめん。まだ寝てるわ
http\/\/:(www\.)?2ch\.net\/
0130nobodyさん03/01/20 11:15ID:???
>>127
> エラーにならないんでしょうか?
エラーになったら誰も使わなくなるから(w
0131nobodyさん03/01/20 19:22ID:gSzazTge
>>127
Perlだと、こう書く。
m#^http//:(?:www\.)?2ch\.net/$#

完全一致だよね。知らないけど。
あと、DNSは大文字小文字を区別しないから、この書き方は間違ってる。

今の場合は、単に正規表現を聞いてるんだから、/をエスケープする必要は無いし、
それに、Perlで使うときも、いちいち/をエスケープするのは、エレガントじゃない。
0132nobodyさん03/01/20 20:43ID:vz/F/uwh
>>131
でも、なんで
s/http://www\.2ch\.net/http://www\.1ch\.net/;
がエラーで
$url = 'http://www\.2ch\.net/';
$b = 'http://www\.1ch\.net/';
$url =~ s/$url/$b/;
がokなんでしょうか?
そのへんの理屈がよく分かりません
0133nobodyさん03/01/20 21:52ID:gSzazTge
構文解析時には、変数は展開されていない。
から、インタプリタはs/ / /を認識できる。
0134nobodyさん03/01/20 22:08ID:???
>>132
s///による置換を行う前に、s///の構文チェックをしているからでしょう多分きっと。
s/http://www\.2ch\.net/http://www\.1ch\.net/;
sの次に/があるので/を区切りとした構文としてチェックしてみる。
3つ目の/以降はスイッチ部。
wwwというスイッチは存在しないので、エラー出力
(Bareword found where operator expected, near "s/http://www")

s/$url/$b/;
構文としてはs///という形になるのでOKなので、
次に、正規表現の文字列となる$urlを正規表現のスタック?に展開して積み込み、
同じく$bを展開部用のスタックに積み込んでいるのではなかろうか。

あくまでも想像。
0135nobodyさん03/01/22 11:39ID:Lm4zDQtU
perl1行でgrepと同じ事する方法キボンヌ。

/(^.*key.*$)/$1/
じゃダメポ。

というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
0136nobodyさん03/01/22 11:42ID:???
>>135
`grep hoge`
0137nobodyさん03/01/22 11:44ID:???
>>135
foreach(@hoge)
{
if(/^.*key.*$/)
{
push(@a,$_);
}
}
で、良いじゃん。正規表現が合ってるかはは知らんけれど
0138nobodyさん03/01/22 12:04ID:Lm4zDQtU
>>136
grepが使えたらこんな事はしないかと。

>>137
if等は使えないんですよ。
つまりエディタの検索、置換えに指定する事でgrepするようなものです。
0139nobodyさん03/01/22 12:22ID:???
>>138
>つまりエディタの検索、置換えに指定する事でgrepするようなものです。
?
使えない理由になるの?
0140nobodyさん03/01/22 14:10ID:Lm4zDQtU
>>139
例えですけど、メモ帳の置換えでif使えますか?
マクロじゃないですので使えないです。
0141nobodyさん03/01/22 14:35ID:???
>>140
何を訳のわからんことを。
例えダイアログで指定出来るパラメータが一つでも、内部処理ではアホほどif文が多用されているが。
0142nobodyさん03/01/22 15:50ID:???
>>141
内部処理にいくらIFが使われてようが関係ないぞ。
って何の話してるんだ?
0143nobodyさん03/01/22 15:51ID:???
>>142
こっちが聞きたいよ。
0144nobodyさん03/01/22 15:59ID:???
エディタの中の人も大変だな
0145nobodyさん03/01/22 16:47ID:Lm4zDQtU
>>141
何か大きく勘違いなされてるようで。
とにかく、1行(s/find/rep/)の構文だけでgrepと同じ事を出来ないかと言う事です。

スクリプトを組めるなら最初からそうしますが
制約上そのような事ができません。
0146nobodyさん03/01/22 16:49ID:???
>>145
何か根本的に勘違いなされているようなので。
0147nobodyさん03/01/22 17:30ID:Lm4zDQtU
>>146
どういう事でしょうか?
0148nobodyさん03/01/22 17:36ID:???
>>147
はじめから落ち着いて、

・一体どんなアプリケーションを作っているのか。
・一体そのアプリケーションのどの処理で悩んでいるのか。
・ifが使えない制限とは?

位は書いてくれい。
0149nobodyさん03/01/22 17:56ID:Lm4zDQtU
>>148
・使ってるソフト。
よくあるファイル一括書換えソフト。

・やりたい事
メモ帳の置換え(CTRL+H)のような感じで
検索する文字と置換えする文字を指定する事で
ファイルの内容を一気に高速で書き換えられる。
検索文字列及び置換え文字列はBREGEXP.DLLを使う事で
Perlと同等の置換えが指定できる。
その検索文字列と置換え文字列の指定方法。

・IFが使えない理由。
メモ帳のように検索文字と置換え文字を指定する事しか出来ない為。
ソフトを作ってる訳ではなく使っているだけ。

です。以上で分かって頂けるでしょうか?
0150nobodyさん03/01/22 17:58ID:???
>>149
はじめからそう書いてくれれば良かったのにね。
無理でしょ。
0151nobodyさん03/01/22 18:06ID:Lm4zDQtU
>>150
何故無理と言い切れるのでしょうか?
0152nobodyさん03/01/22 18:18ID:???
Perlで描いてドロップレットで一発変換。
0153nobodyさん03/01/22 22:05ID:NkPjRdCp
あ、わかった。>>135は、
正規表現は、置換にも使えると聞き、検索っていうとこで、正規表現をオンにして、
自慢のコードをつっこんでみたが、ちゃんと動かないので、調べるのは面倒だから、
2chに書き込んでみた。でどうだ。

で、さらに、正規表現∈Perlだと思っている。と。

キボンヌって言えば仲間になるから大丈夫だと思っていたら大間違いだぞ。
0154nobodyさん03/01/22 22:06ID:???
>>153
マルチにマジレス、カコワルイ。
0155nobodyさん03/01/23 00:35ID:???
>>144
 ああ!ごめん、見逃してた!反応遅くなっちゃってごめん。
 ・・・では改めて。

 中 の 人 な ど い な い !
0156nobodyさん03/01/23 07:11ID:???
>>153-154
ジサクジエンでした。
0157nobodyさん03/01/23 07:48ID:???
>>155->>144
ジサクジエンデシタ
0158nobodyさん03/01/28 00:31ID:2+2ZA9Pr
ググル(crawl4.googlebot.com他)が来たら〜するというプログラムだけど、
if($ENV{'REMOTE_HOST'}=~/crawl[\d]+\.googlebot\.com/){⊥}
でいいのけ?
0159nobodyさん03/01/28 00:52ID:???
>>158
$robots = "crawl4.googlebot.com";
if($robots =~ /crawl[\d]+\.googlebot\.com/ ){ print "kita----!!";}
をローカル環境でテストしてみる。
0160nobodyさん03/01/28 16:58ID:Go6r3Moz
DNSでは、大文字小文字を区別しないので、iを付ける。
それから、後方一致で調べればいい。

↓普通はこう。googlebotドメインだったらいいんでしょ?
$ENV{REMOTE_HOST} =~ /\.googlebot\.com$/i

↓\dを使うなら、こう使う。\d = [0-9]なので
$ENV{REMOTE_HOST} =~ /crawl\d+\.googlebot\.com$/i
0161nobodyさん03/01/29 11:03ID:aizQjUQ4
2chのトリップなんですけど、
$salt =~ s/[^\.-z]/\./go;
の [^\.-z] これって、具体的にはどれを表すんですか?
0162nobodyさん03/01/29 13:00ID:w0j+LU9j
>>161
./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
↑以外
0163nobodyさん03/01/29 20:26ID:VPOVuFRE
>>135
s/^(?:(?!foo).)*$//
でどうよ?

>>150
能無しが煽ってんじゃねーよ。
0164nobodyさん03/01/29 21:05ID:???
>>163
煽りはスピードが命。
0165nobodyさん03/01/29 21:40ID:aizQjUQ4
>>162
ありがとん。
0166nobodyさん03/01/29 21:45ID:Jsuq0iRw
next if ($title !~ s/$word/<B>$&<\/B>/i);
で、$word に「エロ」を入れてやると、「トロ」という言葉にもマッチするんですが、
何故でしょうか?
0167nobodyさん03/01/29 22:08ID:???
>>166
最後の i のせい。
「エ」の2バイト目は "G"
「ト」の2バイト目は "g"
i をつけると大文字小文字を区別しなくなるので、この2つがマッチする。。
0168nobodyさん03/01/29 22:11ID:???
>>166
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
ここを読んでおけ
0169nobodyさん03/01/29 23:18ID:???
>>164
( ´_ゝ`)フーン
能無し君がまだ初心者相手に威張る為ここに居たんですか。
まぁ分からない事聞かれて逆切れしてるような貴方にはここがお似合いですね。
( ´,_ゝ`)プッ
0170nobodyさん03/02/01 02:36ID:???
>>169
本当は>>163宛に書きたかったの?
0171質問者03/02/02 12:33ID:aPQL5QO2
複数のor条件な文字列を検索したいとして、
一回の検索で、マッチした文字列がどの条件にあたるかを知ることが出来る?

たとえば
対象文字列: abcdefg
検索語彙: (ab)|(fg)
こういうとき、"ab"と"fg"がマッチするということはわかるが
マッチした文字列がそれぞれどの条件だったのかを知りたい。
BREGEXP(Perl5)もしくはVBRegularExpressionで。
一回の検索では無理?
0172nobodyさん03/02/02 12:35ID:???
>>171
プログラム板に帰れ!



とかいって遊んでみる。


$1に入ってないか?
0173質問者03/02/02 12:39ID:aPQL5QO2
>>172
実はプログラム技術板から来た。
正規表現スレがあるのはこの板だけっぽい。

マッチ文字列を取得することは可能なのだが、
何にマッチしたのかを確かめるためにはどうすれば‥‥?
0174nobodyさん03/02/02 12:42ID:???
>>173
つぅか誘導したのはこの俺だ。


マッチさせたい文字列は自明(自分で設定したんだからな)なのだから後はifとeqで比較すればどうだ?
0175質問者03/02/02 17:45ID:aPQL5QO2
>>174
そか、どうも。

マッチした文字列を検索文字列と比較するということ?
>>171で書いた例についていえばそのとおりだが
正規表現でマッチさせたものについて知りたいので
単純にifで比較してもしょーがない。
(検索文字列が"a."などのとき、比較してもしょうがない)
かといって正規表現でテストするってのも二度手間だし。
正規表現でうまく書けば出来るとか、
普通そーゆー機能あるよ、とかいうことはないですかー?
0176nobodyさん03/02/02 17:47ID:???
?

$x =~ /(ab)|(cd)/;

if($1 eq "ab")
{
print("ab");
}
0177nobodyさん03/02/02 17:56ID:???
perlなら、もう一度マッチングさせるかな。
なるべく別々に処理を行うようにするけど。
VBとかの機能はマ板で訊いてください。
0178nobodyさん03/02/02 17:58ID:???
>>177
>マ板で訊いてください。

・・・なぜ!?
0179質問者03/02/02 18:20ID:???
>>176-177
ありがと。
もしかして知らないところで世の中便利になってて
一撃で出来るかなーと思ったのですが。
とりあえずあきらめときます。
018017703/02/02 18:57ID:???
>>178
ム板だった。
素で間違えた(w
0181nobodyさん03/02/02 21:59ID:???
>>180
いや、いいんでないの?w
0182nobodyさん03/02/14 01:16ID:???
もげ
0183nobodyさん03/02/17 07:11ID:tFA1sH7S
/hoge/piyo/foo\/bar/baka/
という文字列を split して
[ 'hoge', 'piyo', 'foo\/bar', baka ]
という配列を得たいのですが、/ で split するけど \/ では split しない
ってのはどう表せますか?
0184nobodyさん03/02/17 08:04ID:???
[^\\]\/
0185nobodyさん03/02/17 10:03ID:???
>>184
バックスラッシュを一般化して使いたい場合を考えると split するより

my $path ='/hoge/piyo/foo\\/bar/baka/';
my @nodes;

foreach my $elem ( $path =~m%(?:^|\G/)((?:\\.|[^/])+)%g ){
$elem =~s/\\(.)/$1/g; # バックスラッシュを取り除く場合。
push( @nodes, $elem );
}

みたいなのの方がいいと思う。
これだと

/hoge/piyo/foo\/bar\\/baka/ => ['hoge','piyo','foo/bar\','baka']

みたいなのにも対応出来るし。

s///g 使って無理矢理1ステートメントにするのもアリか。
018618303/02/17 11:44ID:???
ありがとうございました
0187nobodyたん03/02/18 01:11ID:???
FYI
@hoge = split m[(?<!\\)/], $path;
0188nobodyさん03/02/18 18:45ID:???
strong 要素内の“</p><p>”を取り除くため、以下のように書いてみたんです。

while ($value =~ /(<strong>.*?)<\/p><p>(.*?<\/strong>)/)
{
$value =~ s/(<strong>.*?)<\/p><p>(.*?<\/strong>)/\1\2/g;
}

※ $value に HTML が入っている。

初めはこれでも問題なかったんですけど、例えば、

$value = "<p><strong>あ</strong></p><p><strong>い</strong></p><p><strong>う</strong>";

のとき、置換後の $value は、

$value = "<p><strong>あ</strong><strong>い</strong><strong>う</strong>";

となってしまいます。この書き方で大丈夫だと思っていたのに、どうなってるんでしょうか・・・
0189nobodyさん03/02/18 18:57ID:???
>>188
<strong>.*?</p><p>.*?</strong> だと、

<strong> => <strong>
あ</strong> => .*?
</p><p> => </p><p>
<strong>い => .*?
</strong> => </strong>

ってマッチしちゃうよ。

$value =~s{<strong>(.*?)</strong>}{
my $tmp =$1;
$tmp =~s|</p><p>||g;
"<strong>$tmp</strong>";
}ge;

とか。もっと良いやり方ありそうだけど。

019018803/02/18 19:13ID:???
ごめんなさいごめんなさい。もの凄く馬鹿なことを書いてしまいました。
あまりの睡魔に襲われて、今 コタツで寝ながら考えていたのですが、私の書き方だと strong 要素内に </p><p> がない場合を考えてないわけですよね。
本当に申し訳ございません・・・

>>189
有り難うございます。
教えて頂いた方法ですが、あとで勉強しながら考えてみます。
どうも私ではすぐには理解できそうにないもので。

とにかく有り難うございました。
0191nobodyさん03/02/18 20:27ID:???
眠い時って、まともなprog書くの無理だよな。
0192nobodyさん03/02/18 23:46ID:oZOSGD0m
正規表現を初めて2日目です(ごめんなさい)文字列の置換だとか検索に感動してます(申し訳ない)。
正規表現を勉強し始めた理由は、以下の質問からです。
192.168.1.8が、192.168.1.0/24 のネットワークアドレスに含まれているかどうかを
判定する正規表現を書くことは可能でしょうか。
よろしくおながいします。
0193nobodyさん03/02/18 23:48ID:???
人間用表記から、ビット列に直して、ビット演算で適当にやったほうが速いような気がするぞう。
0194nobodyさん03/02/18 23:50ID:???
>192.168.1.8が、192.168.1.0/24 のネットワークアドレスに含まれているかどうかを

ならtrueなのは自明だけど。
019519203/02/19 00:13ID:bka3cebn
>>193
ありがとうございます。やっぱし、正規表現よりは普通にプログラムで
やったほうが良いですか、、ちなにみJava使いです。んー、書いたことないので
なやみます。
0196nobodyさん03/02/19 00:49ID:???
>>195
無視された・・・Java.util.regex使いなのに無視された。
0197nobodyさん03/02/19 00:59ID:???
ビットマスクが8の倍数なら正規表現でも簡単だけど・・
0198nobodyさん03/02/19 01:00ID:???
あぁ。サブネットマスクだった。
0199nobodyさん03/02/19 01:21ID:???
正規表現雑技団とかでやりそうなネタだな。
020019203/02/19 02:16ID:bka3cebn
>>196
ええ、あれ、なんか、無視しちゃうような悪いことしちゃいましたか?
すいません、何かサンプル教えて下さるとうれしいす。。。
0201nobodyさん03/02/19 02:23ID:???
これがスッキリとした正規表現で書けるっていうなら見物だな。
0202nobodyさん03/02/19 16:59ID:oL6d+rQl
select * from testtable where name = 'hoge's name';
という文字列があり、
name = 'hoge's name'の、内側の'だけをエスケープして置換えたいのです。

つまり
select * from testtable where name = 'hoge\'s name';
としたいのです。
ただし外側の'は必要ですのでエスケープしたくないのです。

込み入った例を書くと文字列が
name = ''''' and value = '''' の場合は、
name = '\'\'\'' and value = '\'\''

にしたいのですが、このような複雑な処理を正規表現で行うのは無理なのでしょうか?
0203nobodyさん03/02/19 17:09ID:???
>>202
最大マッチで検索。
0204nobodyさん03/02/19 17:45ID:???
>>202
> 込み入った例を書くと文字列が
> name = ''''' and value = '''' の場合は、

最大マッチでも難しそう・・・
0205nobodyさん03/02/19 18:15ID:???
無理だろう、これは。

SQL だと 文字リテラルのでてくる場所たくさんあるから
個数限定ってわけにもいかないし。

対になってるわけでもないし。

'' ' ' '' ' ' ' '

こんな文字列からクオートすべきのを見つけろ、ってのとかわらんもん。

どういう案件かはわかんないけど、
SQL に置き換える段階でクオートしなかったのが敗因ですね…
0206nobodyさん03/02/21 12:55ID:6n4aSTAx
>>203-205
了解です。
楽しようとせずSQL文を完成する前に
ひとつずつ置換えるようにします。

どうもでした。
0207nobodyさん03/02/21 15:31ID:???
>>206
お役にたてず申し分けない。
0208nobodyさん03/02/21 15:37ID:???
せめて一行に一回しか出て来ないとか、''の両端は必ず空白とかの目印があればいけそうだけど。
0209nobodyさん03/02/21 22:45ID:Kv1GvIlP
初歩的なあれですが、()のなかに()があって、
そのなかに | があっても大丈夫ですか?
/(2ch\.net|1ch\.(com|org))/
みたいな・・
0210nobodyさん03/02/21 22:52ID:???
>>209
.に行っているように\でエスケープしてください。
0211nobodyさん03/02/21 23:19ID:???
>>209
えっと・・あとどれをエスケープするんでしょうか?
この場合合致させたいのは
2ch.net
1ch.com
1ch.org
です
0212nobodyさん03/02/21 23:26ID:???
>>211
基礎から勉強し直せ。
0213nobodyさん03/02/22 10:01ID:???
てゆーか、それくらいとっとと自分で試してみればいいのに。
0214nobodyさん03/02/22 10:12ID:???
でもまあ、サーバー上でしか実験出来ないような環境作っちゃった場合は
聞いた方がはやいやーってなっちゃうだろうね。

0215nobodyさん03/02/22 10:46ID:???
>>214
>でもまあ、サーバー上でしか実験出来ないような環境作っちゃった

それ、何もしてないってことじゃん。
0216初心者質問者03/02/22 17:49ID:Db6aP06C
ダブルクオーテーションで括られた文字列の、
ダブルクォーテーション内部だけをマッチさせたいんですけど。
$1使わないと無理?
0217nobodyさん03/02/22 17:53ID:???
>>216
"が偶数回出てきてる行は囲まれてるな。
0218nobodyさん03/02/22 18:52ID:???
>>214
ActivePerlでもなんでも入れれば一発だろうにな。
怠惰な奴は嫌われる。
0219nobodyさん03/02/24 12:33ID:fQYme6i5
質問です。
ある文字列から始まらない任意の文字列、というのは
どうなって書けばいいんでしょうか。
例えば、<a href...>以外のタグを見つけるといった場合ですが、
文字列a hrefから始まらない、という事で
/<[^(a href)][^>]*>/
という感じかと思ったんですが、これではダメなようなので・・・。
0220nobodyさん03/02/24 18:33ID:???
>>219
!~ /^ある文字列から始まらない任意の文字列/
0221nobodyさん03/02/24 18:51ID:???
この場合、否定先読み、否定後読みを使うんじゃないかね?
0222nobodyさん03/02/24 22:21ID:???
Perl5の場合は、正規表現の拡張構文を使うとこんな感じ。

/<(?!a href).+?>/
0223nobodyさん03/03/03 16:51ID:PjU+W5oK
前スレに似たような質問を見つけて読んだけど・・・
なんか「知らんヤツ書くな!!」とかで正しいのかどうか解りません。。
どなたかご教授お願いします。

言語:Perl 掲示板CGIを作っています。
やりたいこと:特定のタグ以外は無効にする。
私が考えた処理は・・・指定したタグの中身に合致しなかったら消す。
@yukotag = "('b'.'/b'.'u'.'/u')";
if ($value ne "<@yukotag>") {
$value =~ s/<(.*)>//g;
}
でもこれではそもそも動かない・・・エラーにはならないけど。
#有効になるべきタグも消えてしまいます・
どうしたらよいのでしょう。
022422303/03/03 16:53ID:PjU+W5oK
もう一個考えた・・

if ($value ne "<(b|\/b)>") {
$value =~ s/<(.*)>//g;
}
0225nobodyさん03/03/03 16:55ID:???
全てのタグをエンティティに変換し、その後許可タグだけ戻すのが王道。
0226nobodyさん03/03/03 17:27ID:???
>>223-224
Perlを基礎から勉強してください。
基本的な考え方は>>225の通り。こんな感じで。

@yukotag = ('a','u');
$value =~ s/<(\/?.*?)>/<$1>/g;
map { $value =~ s/<(\/?$_.*?)>/<$1>/ig } @yukotag;
0227nobodyさん03/03/05 12:28ID:vWidvRyz
改行二回にマッチさせたいんだけど

$_=~/\n{2,}/g

ではだめれすか?
0228nobodyさん03/03/05 12:30ID:???
>>227
ダメだったんですか?
0229nobodyさん03/03/05 12:33ID:???
my $kaigyou = '(?:・r・n|・r|・n)'
$_ =~ /${kaigyou}{2,}/$nanika/g
023022703/03/05 12:37ID:???
マッチしませんれした
0231nobodyさん03/03/05 20:15ID:???
>>230
$_ =~ /\n{2,}/gs;
023223003/03/05 22:23ID:???
$a="aaa\nddd\nfff\n";
if($a=~/\n{2,}/gs){print"OK!\n";}

?????????????????????????????

0233nobodyさん03/03/05 23:11ID:???
>>232
Safariかよ。
0234nobodyさん03/03/05 23:36ID:???
>>232
おいおい、「改行ニ回」ってそういう意味かよ。
上の回答者はみんな、あんたが「ふたつ(以上)連続する改行」に
マッチさせたがってると思ったんだよ、あんたの質問と例を読んで。

$a = "aaa\nddd\nfff\n";
if(($a =~ s/\n/\n/gs) >= 2) { print "OK!\n"; }
023523003/03/06 03:31ID:???
スマソ
激しく反省
0236nobodyさん03/03/06 03:53ID:???
ネストした括弧へのマッチを一つの正規表現で表すことってできるかな。

((a.b)(c.d)(e(f(g.hij)))k) -> マッチ
((bcd))) -> だめ。

0237nobodyさん03/03/06 04:34ID:???
>>236
無理。
正規文法の限界。
(文脈自由文法以上ならいける
0238サチ03/03/08 13:12ID:dLehQyhy
@data=("a","b","ゝ","⊂","≡","⌒","▼","≧","∂");
my $count = 0;
foreach (@data) {
$count += $com =~/\Q$_\E/;
……

 この ~/\Q$_\E/ ってどういう意味なのでしょうか?
 厨房的な質問ですみません。
0239nobodyさん03/03/08 13:15ID:???
>>238
(ォと同じ意味ですよ。
0240nobodyさん03/03/08 13:20ID:???
>>238
それは正規表現というよりPerlの作法。
\Q =英数字以外の文字の前に\を挿入する。
\E =\L,\U,\Qなどの終了

print "\Q$_\E";
とかで効果を見たほうが早いかも。
0241サチ03/03/08 13:32ID:dLehQyhy
あまりに早いご返答ありがとございます。
本当にありがとうございます。
Perlの作法なのですか。
てっきり正規表現かと思ってました。(^_^;
どこかに参考となるURLありますか?
0242nobodyさん03/03/08 13:34ID:???
>>240の説明以上に何が知りたいのかと
0243nobodyさん03/03/08 13:36ID:???
>>242
$_の説明がまだだぞw 
0244サチ03/03/08 13:37ID:dLehQyhy
あっ、その”Perlの作法”がまとめられたトコがあるのかと
思いまして… ごめんなさい。
0245nobodyさん03/03/08 13:39ID:???
>>243
正規表現なのかと(以下略
>>244
ラクダ本
0246サチ03/03/08 13:54ID:???
これから買いに逝って来ます。
ありがとうございました。m(_ _)m
0247nobodyさん03/03/08 14:56ID:???
それを知るためだけにラクダ本を買うのか……
まあ、がんばれよ。
0248nobodyさん03/03/08 14:56ID:???
>>247
今頃びっくりのお値段に悶絶してることかと。 
0249nobodyさん03/03/08 15:13ID:???
3rd だと2冊だし。
デスクトップリファレンスで良いかと。
0250nobodyさん03/03/08 16:20ID:???
いや、これをきっかけに Perl ヲタになるやもしれん。
同じオライリーなら詳説正規表現もお勧めだよ。
0251サチ03/03/08 18:13ID:???
高かぁ〜い!ヽ(`Д´)ノ
お金がないので諦めました。

詳説正規表現ですか。。φ(..)


0252nobodyさん03/03/08 20:14ID:???
よく入門書で、「正規表現を詳しく解説してると本が1冊書ける」とか書いてるけど
本当に本1冊書けるし、実際に本が出てるんだよね。
それぐらい奥深いものなのかと。
0253nobodyさん03/03/08 20:38ID:???
俺はソフトバンクの「正規表現の達人」持ってる。
他にも赤い表紙の奴とか、オライリー以外にも2、3冊ぐらい
正規表現の本を見かけたことがある。
025417703/03/08 20:46ID:???
詳細も高いって(w。
025525403/03/08 20:47ID:???
おっと、詳説でした。
0256nobodyさん03/03/08 21:07ID:???
でも詳説は勉強になったよ。
あれ勉強してからチューンしたら性能が4割は上った。
はじめは馬鹿にしてたんだけどね。
0257nobodyさん03/03/08 21:53ID:???
確かにいい本です。
正規表現はスクリプトの実行速度に影響を与えていることが
結構あったりしますので、コードチューニングには、いい本です。
しかし、入門には少々マニアックすぎるかも。
# 毒食えば皿までかな。
0258nobodyさん03/03/09 00:39ID:???
>>237
Perl5.6以降では(??{})でいけたような。
もはや「正規表現」とは言えないわけだがだいぶ前から
Perlの正規表現は厳密な意味で正規表現じゃないし
0259nobodyさん03/03/09 00:51ID:???
>>251
忘れてた。Perlに限るなら、EffectivePerl(3章)をおすすめ。
0260nobodyさん03/03/09 12:49ID:9EZ5B9RA
JavaでOMOつかってます。matchで「aaabbbcccdddd」という文字列に対し、
aもしくはdという文字列が含まれているかという判定を正規表現で書きたいのですが…
超初心者ですんません。

0261nobodyさん03/03/09 12:54ID:???
>>260
[ab]
026226003/03/09 16:47ID:???
ありが�d�d�d
0263nobodyさん03/03/11 10:43ID:V1nwV3pf
「次の言語に対する正規表現を書きなさい
 0と1からなる列で0は偶数回、1は奇数回現れるもの全て。」

わからない…。ていうか可能?
0264nobodyさん03/03/11 10:58ID:???
>>263
(00)* 偶数=2n

(11)*1 奇数=2n + 1



0265nobodyさん03/03/11 11:05ID:???
>>264
ハァ?10110とかもだろ
0266nobodyさん03/03/11 11:12ID:???
>>265
良かったな。
0267名無しさん@Meadow03/03/11 11:16ID:wliWOweu
>>263
Perlだしゅ。正規表現じゃないな。
while(<>) {
@zero=m/0/g;
@ichi=m/1/g;
if ($#zero % 2 != 0 and $#ichi % 2 == 0) {
print;
}
}
0268nobodyさん03/03/11 11:17ID:???
>>263
その問題文、「次の言語に」って言い回しからしてなんか怪しくない?
0269nobodyさん03/03/11 11:45ID:???
>>268
どういうこと?原文ままだと

*3.7 次の言語に対する正規表現を書きなさい.
 a) 5個の母音a,e,i,o,uがこの順序でどこかに現れる英字列すべて
 b) 辞書式順序の関係に従って現れる英字列すべて
 (略)
 f) 0と1からなる列で,0は偶数回,1は奇数回,現れるものすべて
 (以下続く)

「コンパイラI 原理・技法・ツール」(通称ドラゴンブック)ていうやつの練習問題。
0270nobodyさん03/03/11 14:35ID:???
>>269
ソレ、学校の課題かなんかじゃねえの?
それなら自分でやれよ。

もし違うならスマソ
0271nobodyさん03/03/11 15:29ID:???
>>269
普通なら「次の文字列に対する〜」だと思うが。
言語?
0272nobodyさん03/03/11 16:10ID:???
ところで。
オライリージャパンの「正規表現」って本読んだ。
ちょっと古めなのであれだったけど。
(\4000)

書いてある内容はあれだったけど、
説明のしかたがクソだった。

よくオライリーからあんなクソ説明本が出たもんだ。
読んでる途中で嫌になってくる。
0273nobodyさん03/03/11 18:14ID:???
>>272
アンタの説明も(ry
0274nobodyさん03/03/11 19:10ID:???
>>270
いや、ただ気になったので。この類の本って問題だけで答えがないってのが
多い気がする。

>>271
「言語」はあるアルファベット(文字集合)からなるものの列をいうっていうようなことが
書いてあるので、たぶんここでは文字列っていうのと同じとみていいと思う。
「言語 受理」で検索するとそれっぽいページが多くヒットするので分野によっては
普通の表現なのかも(「受理」はまぁつまり「マッチが成功する」って言う意味)。
0275nobodyさん03/03/11 23:48ID:???
あぁー分からないよぉ。。もちろんPerlの拡張正規表現は使わないんでしょ?
0276nobodyさん03/03/12 00:09ID:???
>>275
あんたが何がわからないかわからないのだが
0277nobodyさん03/03/12 00:23ID:???
>>275
使えばできる?
0278nobodyさん03/03/12 22:04ID:hmpHRxfR
2ちゃんのスレッドのソースから名前だけ取り出す正規表現ってどうすればいいですか?
0279nobodyさん03/03/12 22:31ID:wNWBQmqk
>>272
たぶんあなたのレベルの問題だと思うぞ。
あと2,3回我慢して読んでみなよ。
0280nobodyさん03/03/12 22:38ID:???
.*
と
.+?
の違いって何ですか??
0281あぼーんNGNG
あぼーん
0282nobodyさん03/03/13 02:18ID:???
>>280
前者にヒットして後者にヒットしないものは空文字列くらいかな。
0283nobodyさん03/03/13 02:21ID:???
>>282
後者にはなんでヒットしないの?
0284nobodyさん03/03/13 02:42ID:???
>>283
そういうルールだから
0285nobodyさん03/03/13 15:28ID:???
あれ、
(x?) って (|x) の略記法だと思ったんだけど。
だから空にもマッチするんじゃないの?
0286nobodyさん03/03/13 15:44ID:???
>>285
その"?"と、>>280の"?"では意味が違います。
>>280の"?"は量指定子(この場合は"+")の後ろにありますので、
これは「最短のマッチを選べ」という指示になります。
結果として、".+?"は「何か一文字」にマッチするということになりますね。
0287山崎渉03/03/13 16:58ID:???
(^^)
0288nobodyさん03/03/13 19:43ID:???
>>286
なるほど、"+?" で一つのメタ記号なんですね。ゴミレススマソ
0289nobodyさん03/03/13 19:45ID:???
>>288
違うぞ。
0290nobodyさん03/03/14 00:04ID:???
0291nobodyさん03/03/14 00:04ID:???
0292nobodyさん03/03/14 00:04ID:???
0293nobodyさん03/03/14 00:05ID:s293/lDl
293get
0294nobodyさん03/03/14 00:23ID:???
{0,1}という意味での?と、
* +の後ろにくっつけた?は意味が違う。

だから、*? +?で1つのメタ文字として考える方が正しいといえる。
0295nobodyさん03/03/14 00:38ID:???
>>294
*?とか+?は、メタキャラクタのみで構成されているってだけの話で、
所詮は正規表現の1パターンでしかないと思ふ。
0296nobodyさん03/03/14 18:50ID:???
>>282は間違いなんですね?
0297nobodyさん03/03/14 20:20ID:???
>>296
伺う前に自分で実験しる。これ基本。
0298nobodyさん03/03/14 21:01ID:???
>>297
わかりやしたです。
0299nobodyさん03/03/15 23:25ID:???
量指定子の後ろに「?」をつけると「最短一致」
だから>>280は間違いと。やっとわかったよ。
0300nobodyさん03/03/20 21:24ID:8BKMA1mq
>>299
ちがうよ(ぷ
0301nobodyさん03/03/21 01:13ID:???
>>263 http://www.din.or.jp/~ohzaki/regex.htm#AevenBodd
0302nobodyさん03/03/26 17:02ID:4WzRK9Se
文字列の中で、「;」を消したいんだけど「<」や「>」の「;」は
そのままにしておきたいような場合はどのように表記すればいいんでしょうか?
s{[^(?:&|<|>|")];}{}g とか
s{[^&|<|>|"];}{}g とかやってみましたがうまくいかず。
どなたか助けてください。
030330203/03/26 17:16ID:4WzRK9Se
↑間違えました。

文字列の中で、「;」を消したいんだけど「&lt;」や「&gt;」の「;」は
そのままにしておきたいような場合はどのように表記すればいいんでしょうか?
s{[^(?:&amp|&lt|&gt|&quot)];}{}g とか
s{[^&amp|&lt|&gt|&quot];}{}g とかやってみましたがうまくいかず。
どなたか助けてください。
0304nobodyさん03/03/26 19:37ID:???
>>303 Perlならこれでどうだ
s/(&(amp|lt|gt);)|;/$1/g
0305nobodyさん03/03/26 19:42ID:???
s/(?<=&\w+);//g
0306nobodyさん03/03/27 01:45ID:lpoVliEY
はじめまして。正規表現覚えたての者です。
if($FORM{'pass'} =~ /[0-9]pass/)

わかると思いますが、これは$FORM{'pass'}が[0-9]passだったら○○する、という命令なんですけど、
この0から9を0から24にしたいんです。
if($FORM{'pass'} =~ /[0-24]pass/)
これじゃあ0から2と認識されてしまいました。

どうかご教授お願いします。。
0307nobodyさん03/03/27 02:14ID:DK9B1aQJ
>>306
if($FORM{'pass'} =~ /(1?[0-9]|2[0-4])pass/)
でいいんじゃないかなあ。
0308nobodyさん03/03/27 02:20ID:DK9B1aQJ
>>306
if($FORM{'pass'} =~ /(\d+)pass/ && $1<24)
とかでもできるかなあ。
0309nobodyさん03/03/28 10:31ID:q5wWnzii
なんらかの文字列がn回以上続く という書き方はどうすればいいのでしょう?
/.{10,}/
こう書いたのですがなんでも10回続けばマッチしてしまう(10文字以上の長さだったらマッチ)
kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お
にマッチせず、
あいうえお!!!!!!!!!!!!!!!!
や、
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
などにマッチさせたいんですが、どういう書き方をすればいいのでしょうか?

どうぞ、よろしくお願いします。
0310nobodyさん 03/03/28 10:45ID:???
>>309意味不明
kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お

コレだって10文字以上だろ
人間にとって意味がある文章を洗い出すって意味なら無理
0311nobodyさん03/03/28 11:26ID:???
>>309
/(.+)$1{9,}/ じゃダメ?。あんましオススメしないけど。
031230903/03/29 03:39ID:WGdDwe6j
すいません、言葉が足りなかったようですね。。。
なんらかの文字列がn回以上続く
↓
なんらかの文字列が連続でn回以上続く

「連続」で続いてないとだめなんです。
だから、
kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お
は、マッチしません。
あいうえお!!!!!!!!!!!!!!!!
は、「!」が10個以上あるのでマッチします。
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
は、「あいうえお」が10個以上あるのでマッチします。

こんな表現は無理なんでしょうか?

>>311
これでは無かったです。
単にn文字以上、ではなく、連続で続くとマッチさせたいんです。
0313nobodyさん03/03/29 11:26ID:???
$str = q|kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お|;
if ( $str =~/(.+)\1/ ) {
    print 'OK';
} else {
    print 'NG';
}
0314nobodyさん03/03/29 17:46ID:???
Perlメモのやつを使えば、全角文字も1文字として扱える
0315nobodyさん03/03/29 18:25ID:???
半角しか考えないバージョンの答えはこれ。多分
/(.+)\1{N,}/

Nはn - 1で。
031630903/03/29 22:08ID:xi1Z4LcN
できないかな。。。
一応サンプル
ttp://thebbs.jp/common/thetop/index.html
連続した文字に反応します。
このようにしたいんですけど。。。
0317nobodyさん03/03/29 22:17ID:???
>>316
>>313-315を読んだか?
031830903/03/31 00:38ID:rrn9gB8/
お〜!!
すいません、>>315サソのでいけました!
みなさんどうもありがとう・゚・(ノД`)・゚・
031930903/03/31 00:50ID:???
あ、でも半角だけか。。。(´・ω・`)
0320nobodyさん03/03/31 05:06ID:???
>>319
ま、当面は大丈夫じゃないの?
0321nobodyさん03/03/31 18:43ID:???
Perlメモから、文字の正規表現を持ってくればできる。EUC-JPのみ対応

$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

/((?:$ascii|$twoBytes|$threeBytes)+)\1{N,}/
0322nobodyさん03/03/31 18:46ID:???
あ、でも>>315でも2バイトの繰り返しとして判断されるから、
ちゃんと動く(ように見える)かも。ずれた時は…
0323Perl03/04/04 15:20ID:???
? (十進数) {2,4} ;
?x (十六進数) {,4} ;
でない #(任意の16文字) にマッチさせるにはどうしたらよいですか。
0324名無しさん@Meadow03/04/04 23:02ID:???
>>323
わけわか
人にわかるように書け

0325nobodyさん03/04/04 23:23ID:???
>>323
同じくわけわか
任意の16文字にマッチさせたくないものを書いて
0326nobodyさん?03/04/05 04:37ID:bmLMbrZJ
$str = '123 名前:<font color="#008800"><b> nobodyさん </b></font>' から
<b></b>タグで挟まれた文字列(レスの名前部分)だけ残す場合、どんな方法がありますか?

$str =~ /<b>([^<]+)<\/b>/; $str = $1;
$str =~ s/.*<b>([^<]+)<\/b>.*/$1/;
ってのはエレガントじゃないですよね
0327nobodyさん03/04/05 04:47ID:???
($str) = $str =~ /<b>([^<]+)<\/b>/;

これじゃだめ?
0328nobodyさん?03/04/05 05:08ID:???
>>327
配列コンテキストだとマッチした文字列の配列をを返すんですね。
なるほどサンクスです。
0329Perl03/04/05 10:25ID:???
>>323の?は、半角の&です、、、
化けてしまった。
0330Perl03/04/05 10:26ID:???
半角の&#だった、スマソ。? &#
0331デフォルトの名無しさん03/04/05 11:11ID:E+nPGg0Q
>>330
わけのわかるように書け、といてるのがわからんかな。
(a) /#.{16}/ # '#'に続く任意の16文字じゃ
(b) /?[0-9]{2,4}/ # '?'に続く十進数2個〜4個じゃ
(c) /?(x[0-9a-z][0-9a-z]){,4}/ # '?'に続く十六進数表記0個〜4個じゃ
(a)は、(b)でも(c)でもないから、(a)がおぬしの求める解そのもの
ではないのかの。
(b)も(c)も含まぬ(a)をマッチさせたいのではないのかの。
それなら別の問い方がある。日本語をべんきょし直してこい
0332nobodyさん03/04/05 14:40ID:7kbMg08s
\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n

から最後の\n〜\nを消したいのですがどうすればいいですか?
結果的に
\nああああ 2003/6/08\n\nsdfg 2004/9/9\n
というふうにしたいのですが
0333nobodyさん03/04/05 14:47ID:???
$ perl -e '$_="\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n";s/\n[^\n]+\n$//;print'
0334nobodyさん03/04/05 16:15ID:???
>>332
join('\n',(split(/\n/,"\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n"))[0..3])

こじつけ(w
033533203/04/05 17:02ID:7kbMg08s
すいません\nは改行ではなく文字として扱いたいのですが
0336nobodyさん03/04/05 17:10ID:???
>>335
はあ?\\nでいいだろ?入門書買え
0337Perl03/04/05 22:53ID:???
>>331
> (b)も(c)も含まぬ(a)をマッチさせたい
そうです。
質問者の癖に揚げ足を取っとくと、
(C)は [0-9a-fA-F]。

「純粋な正規表現」ではできないのですか?
Perlなら下記でいけそうですが。
/(?<!&)#.{16}/

?(数字); にはマッチしなくて
?(文字); や?(;以外の任意)にはマッチ なんてできませんよね?
0338nobodyさん03/04/05 23:36ID:???
マッチさせてから考える、っということにしよう。
0339nobodyさん03/04/06 00:32ID:???
言ってることがわけわかだから終了でいいだろ
0340Perl03/04/06 01:01ID:???
この板って、&がかけないのか?
同じpc2鯖でもweb製作は使えるのに。

テスト & &です。
&amp; &です。
&# ?です。
0341nobodyさん03/04/09 16:59ID:???
メールのログからメールアドレスだけ除いて出力したいんですが、
どういう正規表現使ったらいいでしょうか
http://www.din.or.jp/~ohzaki/perl.htm#Mail
を見てみたのですが、ちょっと分かりませんでした…。
言語はまだ未定なのですが、perlでできればいいなと考えてます。
0342nobodyさん03/04/09 17:12ID:???
どんなログ形式になってるのか知らないけど、ログの1行を空白で分割すると、
決まった場所にメールアドレスが来てない?
0343nobodyさん03/04/09 17:21ID:???
>>341
ログのフォーマットぐらい書けよ。
その内容によっては正規表現じゃなくたってできることあるし。
0344nobodyさん03/04/09 17:33ID:???
>>342,325
そうですね。
OEのメッセージをテキストで保存したものですが、
----↓一行目から----
送信者: <[email protected]>
宛先: <[email protected]>
件名 : テスト
日時 : 2003年4月9日 17:33
--------------------

てな感じになってます。
ヘッダ部分は決まった場所なんですが、
本文中のメアドも消したいんです。
0345nobodyさん03/04/09 18:09ID:???
>>344 Monazilla関係とみた
0346nobodyさん03/04/10 01:00ID:+Bf7VwF4
どのくらい厳密にメールアドレスを考えるか、って問題?
0347nobodyさん03/04/10 01:08ID:???
メアド部分を探し出し空白に変換すればいいわけですね。
0348nobodyさん03/04/10 01:58ID:???
>>344
メールアドレスの正規表現はググればいくらでも見つかるでしょ
どっちみち、perl5.6以前は完全には表せないけどあまり支障はないと思う
0349nobodyさん03/04/10 03:20ID:vlrWfcuj
あまり知障はないと思う
0350あぼーんNGNG
あぼーん
0351あぼーんNGNG
あぼーん
0352あぼーんNGNG
あぼーん
0353nobodyさん03/04/11 04:03ID:???
341の母でございます。(・・・ってパターンは古すぎだな)
もまいらオススメのMail Addressの正当性チェックパターンを是非341に押しえて
ください。
教科書的には
/^[\w\-+\.]+\@[\w\-+\.]+$/i
・・・って事になるかもしれないけど、これだとage@sageでも通ってしまいまふ。
http://www.din.or.jp/~ohzaki/perl.htm#Mailは現実的じゃないし、perl上で@で
splitして要素数数えてから左辺右辺を個別に評価した方が確実なんでしょうけど、
ここは正規表現一発って事でおながいします。
0354nobodyさん03/04/11 04:18ID:???
/@/
0355nobodyさん 03/04/11 04:31ID:???
>>353
現実的ってのがよーく解らんので答えようがないんじゃけど
0356nobodyさん03/04/11 06:29ID:???
まず、@より左に使える文字の一覧希望。
0357nobodyさん03/04/11 11:44ID:???
>>356
今のところあまり使われてはいないものの、ほとんどどんな文字でもだね。
0358nobodyさん03/04/11 11:59ID:???
>>353
後半を
@[\w\-+\.]+\.[\w\-+\.]+
にするんじゃだめ?
0359nobodyさん03/04/11 13:09ID:???
実際にSMTPに繋いでみる。
0360nobodyさん03/04/11 19:44ID:???
実際に送信して、エラーが帰ってくるか試してみる。
0361nobodyさん03/04/15 07:50ID:???
>>356
空白と@を除く全ての1バイト文字とは違うの?
ドメインにより制限があるが、流動的になり得るので、
ドメイン別の場合分けは無意味と思う。
(1バイト文字=A-Z,a-z,0-9,キーボードから打てる記号)
0362はしのえみ好きー03/04/15 08:10ID:???
それを言うなら印字可能文字
0363nobodyさん03/04/15 12:10ID:GI84bLWk
先頭と最後にダブルコーテーションがない場合は
ダブルコーテーションで必ず囲みたい!

"aaa → "aaa"
aaa" → "aaa"
aaa → "aaa"
どうする?正規表現!
0364nobodyさん03/04/15 12:18ID:VH8m0AHo
s/^\"?([^\"]+)\"?$/\"(\1)\"/;
0365nobodyさん03/04/15 13:14ID:x65/25rD
>>364
ありがとうございます。
でも実行してみたら
"aaa → ""aaa
となってしまいました。。
0366nobodyさん03/04/15 13:20ID:???
>>365
まじで?
私は、余計なかっこがついてきたよ。
だから、こう書き直したら、直ったよ。

s/^\"?([^\"]+)\"?$/\"\1\"/;
0367nobodyさん03/04/15 14:26ID:fimoekOy
>>366
ありがとうございました。
直りました。
0368nobodyさん03/04/15 18:15ID:???
それだと"が途中に入ってる場合にうまくいかない。
それから、正規表現中の"は意味は無いからエスケープする必要は無い。

で、自分ならこう書く。

s/^"?(.*?)"?$/"$1"/
0369nobodyさん03/04/15 18:25ID:W26JC1si
「超」にマッチ、但し「超クール」の場合にはマッチしない、ていうのは
どうするんだろう・・・

超バッド←「超」にマッチ
超能力←「超」にマッチ
超クール←マッチしない

/超^(クール)/ じゃダメらしい・・・

unless(/超クール/){
 if /超/

以外でひとつ・・・
0370nobodyさん03/04/15 18:29ID:???
(?! ... )
037136903/04/15 18:32ID:???
>>379 即レスありがとう!

超(?!クール)

でマッチしますた。ていうか漏れの持ってる本に載ってないよ・・・捨てるか
0372nobodyさん03/04/15 18:54ID:???
5回以上の改行を一回の改行に置換したいのですが、上手くいきません。
\n{5,} マッチしませんでした
\n\n\n\n\n マッチしませんでした

どなたかお願いします・・・。
0373あぼーんNGNG
あぼーん
0374nobodyさん03/04/15 19:08ID:???
>>372
s/\n{5,}/\n/gs ←この最後のsはつけました?
0375nobodyさん03/04/15 19:14ID:???
改行コードが統一されていないとか。
0376nobodyさん03/04/15 19:41ID:???
Perlの拡張じゃなかった?

(?! ) (?= ) とか。そういうのは断り書きしたほうが委員でないか
0377nobodyさん03/04/15 20:09ID:???
ツールによって文法も使える表現の範囲も違うから
何を使ってやりたいのかをちゃんと書いたほうがいいと思う
0378nobodyさん03/04/15 20:58ID:???
>>377
何を使って: bregexp.dll使用のテキストエディタ
やりたいこと: 5回以上の改行は1回にする

です。
0379nobodyさん03/04/15 23:21ID:qSlvjoha
小さなパーサを作っていて,不等式を解析したい。左辺と右辺はそれぞれ一単語または""にはさまれた一以上の単語というルールがある。
で,具体的には不等式の左辺と右辺を取り出したい。

たとえば,
$statement = q["abc de" > 123 or abcde = "zz zz"];
だと,"abc de"とabcdeが左辺,123と"zz zz"が右辺。

これを解析するために

$operand = '(?:<=|>=|>|<|=)';
$var = '(?:\w+|"[^"]*")';
$statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g;
print $statement;

とかすると

(left) "abc de" (right) 123 or (left) abcde (right) "zz zz"

という出力が得られる。

さて,
0380nobodyさん03/04/15 23:22ID:qSlvjoha
問題は左右辺を''でくくる場合も許した場合。たとえば,

$statement = q["abc de" > 123 or abcde = 'zz zz'];

の場合に

(left) "abc de" (right) 123 or (left) abcde (right) 'zz zz'

としたい。

$operand = '(?:<=|>=|>|<|=)';
$var = q!(?:\w+|("|')[^\1]*\1)!; #ここを変えた
$statement = q["abc de" >123 or abcde = 'zz zz'];
$statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g;
print $statement;

だとまったく解析が成功しない。どうして?

0381nobodyさん03/04/15 23:27ID:???
あの、、長文テキストを指定桁数で改行する正規表現をどうやって書けばよいでしょうか。。
本を読んで2日目です、、、急に必要になってしまいました。おやさしいかた、おしえてください。よろしくおねがいいたします。
0382nobodyさん03/04/15 23:35ID:qSlvjoha
>>381
http://www.din.or.jp/~ohzaki/perl.htm#JP_Fold
0383nobodyさん03/04/15 23:37ID:???
>>380
$statement =~ s{
 (\w+|"[^"]+"|'[^']+')
 \s*
 (?:[<>]=?|=)
 \s*
 (\w+|"[^"]+"|'[^']+')
}
{(left) $1 (right) $2}gx;
0384nobodyさん03/04/16 00:18ID:???
>>382
どうもです。
0385nobodyさん03/04/16 13:17ID:QKerHoGZ
HTMLのコメントタグを拾う書式ってどんなのがありますかね?
たしかPerlメモで拾った
<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)
では、マッチしないケースがあるみたいです。
(ここのHTMLなど:http://messages.yahoo.co.jp/yahoo/Computers___Internet/Hardware/Mobile_Phones_/index.html)

<!(?:--(?:(?!--).)*--\s*)*>
だと大丈夫なんですが、十分なんでしょうか?
他にコメントタグの記述形式があれば知りたいです。
0386nobodyさん03/04/17 11:44ID:326c+Ekv
質問です。
ある文字列内に、所定の単語が含まれていない 場合を判定する正規表現を書きたいです。どういう書き方が良いですか。
[^abc] ですと、a,b,cのいずれかが含まれていない、という判定になってしまいます。そうでなく、abc という文字列が含まれていない、というのを判定したいです。
0387nobodyさん03/04/17 13:12ID:???
>>386
!~ /abc/g;
ではあきまへん?
0388nobodyさん03/04/17 13:14ID:???
>>386
処理系にもよるが、/abc/ の結果を反転したほうが簡単だと思う。
0389nobodyさん 03/04/17 13:17ID:???
(?:(?!abc).)*
とか

perl,rubyあたりでしかつかえんよーな・・・

0390nobodyさん03/04/19 15:42ID:???
htmlのタグが混じっている文書から、ある特定のURLだけを抜き出したいのですが
どのようにすればいいのでしょうか?

例えば<td>などで挟まれているhttp://www*.hoge.ne.jp/*****(*は任意の数字)だけを
抽出したいのです
0391nobodyさん03/04/19 16:06ID:9ZhNrFm8
げっ・・・age忘れてた
0392はしのえみ好きー03/04/19 17:08ID:???
><td>などで挟まれているhttp://www*.hoge.ne.jp/*****(*は任意の数字)だけを抽出
/<[^>]+>http://www\d+.hoge.ne.jp/\d+</[^>]+>/
?
0393はしのえみ好きー03/04/19 17:08ID:???
げ。デリミタは/じゃだめだな。!とかにして。
0394はしのえみ好きー03/04/19 17:11ID:???
あ、Perlスレじゃなかったね。(だから.+?使わなかったのに・・・鬱)
しかもピリオドエスケープしてなかったし(もうだめぽ(´・ω・`)
<[^>]+>http://www\d+\.hoge\.ne\.jp/\d+</[^>]+>
0395nobodyさん03/04/19 20:00ID:???
<td[^>]*?>http://www\d\.hoge\.ne\.jp/\d+</td>
039638603/04/19 23:46ID:???
色々アドバイスありが�d。!abcでいけました。たぶん。。JDK1.4.1のregexです。
0397山崎渉03/04/20 05:59ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0398nobodyさん03/04/24 17:15ID:/44ojQ66
<script language=hoge>〜</script>
の範囲を削除したいのですが、こんなんでいいんでしょうか。

s/<script[\s.\S]\s*(.*)\s*>[\s.\S]*<\s*\/script>//gi
039939803/04/24 18:29ID:/44ojQ66
その後あれこれ考慮して、

s/<script\s*.+?>.+?\s*<\/script>//gi

これに落ち着いた感じなんですが、どうでしょうか?
0400nobodyさん03/04/24 18:32ID:???
s#<script[^>]*>.*?</script>##gi
0401nobodyさん03/04/24 18:33ID:???
s#<script[^>]*>.*?</script>##igs
か。。
0402nobodyさん 03/04/24 18:36ID:???
>>399
s/<script[^>]*>(?:(?!<\/script).)*)<\/script>//gi

とか・・・
0403nobodyさん03/04/24 23:39ID:???
s#<script.*?>.*?</script>##isg
0404nobodyさん03/04/24 23:40ID:???
s#<script.*?>.*?</script>##isg
040539903/04/25 01:34ID:fbvwVtSF
短くなるもんですね。。。
>>399の記述でも、目的は達しているように見えるのですが、
ご教示頂いたものを試してみようと思います。

現在、コメントタグの削除に取り組んでいますが、
s/<!--[^>]*-->//g
これで、一応目的は達しているように見えます。
複数行またがるコメントタグも削除できているようです。
しかし、より効果的な記述方法はあるでしょうか?
0406nobodyさん 03/04/25 04:34ID:???
>>405
コメントタグは < >が含まれることがある(というかブラウザー的にはエラーにならない)
のでそれじゃ駄目
あと、改行も問題有るので

s/<!--(?:(?!-->).)*)-->//gs

ぐらいにしとかにゃだめなんじゃない
0407nobodyさん03/04/25 05:04ID:???
>>405
http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
040840503/04/25 10:00ID:EpsK+/d8
>>406
クスコです。試してみます。

>>407
情報源、クスコです。
Perlメモは読んでまして、そこのコメントタグも試しました。
ただ、あれでは意図しない部分まで削除してしまうケースがあるようです。
040912303/04/25 10:36ID:HCZY3VXf
javaの場合
※jdk1.3は正規表現はつかえないから別のライブラリを使う(以下参照)
※jdk1.4は標準でついていたのでそれを使う(使い方忘れた、自分で探せ)
String aaa = \"123456789\";
Pattern pattern_1 = compiler.compile("456",Perl5Compiler.CASE_INSENSITIVE_MASK);
aaa = Util.substitute(matcher,pattern_1,000,aaa,Util.SUBSTITUTE_ALL);
041040503/04/25 12:08ID:EpsK+/d8
海外サイトなんだけど、javascript.faqtsに、コメントタグを削除する、いい答えがありました。
SCRIPTタグの削除も含んでます。
http://www.faqts.com/knowledge_base/view.phtml/aid/21761/fid/597
これの下の方。

/<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style|SCRIPT|STYLE)[\s\S]*?<\/(?:script|style|SCRIPT|STYLE)>)/g;

これ使ったら、見事にうまくいったヨカン。
0411あぼーんNGNG
あぼーん
0412あぼーんNGNG
あぼーん
0413nobodyさん03/04/26 00:57ID:IuuTGNpA
/.+@[a-z0-9]+.[a-z]+/

メアドの正規表現ってこんな感じでいいの(初心者でつ)?
0414nobodyさん03/04/26 01:10ID:???
>>413
メールアドレスを完璧に表すのは難しいぞ
このスレを少し遡れば同じ話題あるよ
0415nobodyさん03/04/26 13:56ID:???
まだこっちのほうが良くないか?

[^@]+@[a-zA-Z0-9\-_]\.[a-z]{,3}
0416nobodyさん03/04/26 19:14ID:???
/^[^\@]+\@(?:[0-9a-z_-]+\.)+[a-z]{2,4}/i
0417nobodyさん03/04/26 19:26ID:???
>>416
TLDは4文字以上も予定されているよ
0418nobodyさん03/04/26 19:28ID:???
日本語ドメインはどうすんの?
0419nobodyさん03/04/26 20:02ID:???
>日本語ドメイン
無かった事にしてくれ。
(でも、確かRFC的には許容内なんだよな。鬱)
0420nobodyさん03/04/26 21:59ID:???
メールアドレスを正規表現でと言っても用途にもよるんだよな。
RFCに適合するかどうかのチェックなら厳密にやらなければならないし、
実際には許されない架空のアドレス風味を表すだけなら簡単だし。
0421nobodyさん03/04/27 01:10ID:???
/\@/; #完璧!
0422nobodyさん03/05/07 01:48ID:U7blGvbH
JavaのOROのPerl5Utilを使っています。
基本的には\が重なること以外にはPerl5と同じはずです。

これ↓を
SELECT * FROM MEMBER WHERE {NAME='[personName]' AND }AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE;

こういう風に
SELECT * FROM MEMBER WHERE AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE;

変換したいのですが下記ではだめなのでしょうか。

/\\{.*?\\[personName\\].*?\\}//
0423nobodyさん03/05/07 02:05ID:???
>>422
いいでつ。
0424nobodyさん03/05/07 03:09ID:???
メールアドレスなら
@よりもあとを正引きしてMXレコードがあるかどうか
調べるとかどう?
0425nobodyさん03/05/07 03:11ID:???
正引きする必要はないか
MXレコードがあるかどうかだけ調べてみるとか
DNS鯖とか落ちてたら登録拒否できるから
確認のメール送る場合とか結構有効じゃない?
0426nobodyさん03/05/07 07:37ID:???
>>422
黙って移動してくんなバカ
0427見習い中03/05/07 09:46ID:l7Gf5uMD
突然の質問で恐縮です・・・

今、正規表現を使って半角英数字のチェックを行っているのですが、
入力テキストエリアに半角英数字が入力されたら、エラーを出すように
したいのですが、

if ($in{'name'} !~ /[a-zA-Z0-9\-]+/ ) { &error("エラーです"); }

としたところ、半角英数字はエラーを返すのですが、
全角英字大文字(ABC)と全角数字(123)も反応してしまいます。
(ToT)...
全角英字小文字(abc)は反応しませんでした。。

半角英数字の入力のみエラーを返したいのですが、どなたか教えてください。
0428あぼーんNGNG
あぼーん
0429nobodyさん03/05/07 10:52ID:???
>>427
もしかしてAだけの入力ならうまく動作しませんか?
バイナリエディタを使ってABC周辺のバイトコードと
abc周辺のバイトコードを比較してみましょう。
043042703/05/08 12:05ID:0MiTKfYx
レスありがとうございます。。
いろんなサイトを調べてみたら、こんなのがあってやってみました。

jcode::convert(\$in{'name'}, 'euc');

if ($in{'name'} !~ /^[\xA1-\xFE][\xA1-\xFE]+$/ ) { &error("エラーです"); }

とやったら、うまくいきました。(全角文字以外はエラーを返します。)
jcode.plの力ということでしょうか。。。プログラムは奥がふかいです。。。
0431nobodyさん03/05/09 22:56ID:???
>>430
EUC-JPの力です。
0432nobodyさん03/05/10 18:06ID:/HHBMizp
すみませんが質問させてください。

ニュースサイトからアンカータグの部分だけを取得してくるスクリプトを
書いていたのですが、htmlソースの一行の中に複数のアンカータグがあった場合、
その全てをきれいに抽出できないのです。例えば、抽出したい元のソースが

<a href="http://aaa.com/">あああ</a>、<a href="http://iii.com/">いいい</a><br>

のようになっていたとして、正規表現でそれぞれのタグにマッチングさせようとしても何故か

『<a href="http://aaa.com/">あああ</a>、<a href="http://iii.com/">いいい</a>』か、
『<a href="http://iii.com/">いいい</a>』だけか、
『<a href="http://aaa.com/">あああ</a>』だけといったようにしか抽出できず、
純粋に
『<a href="http://aaa.com/">あああ</a>』と『<a href="http://iii.com/">いいい</a>』
の2つを取り出せないのです。

拙いながらこのようなことを散々試したのですが……。
while( $list =~ /<a\s.*href="{1}?.*"{1}?.*>{1}?.*<\/a>{1}?/g )
{
print $&;
}

どなたか、助言していただけませんでしょうか。
043343203/05/10 18:09ID:???
自動リンクでなんかアホなことになってしまった。すみません……。
0434nobodyさん03/05/10 19:16ID:???
根本的なセンスが感じられないな
0435nobodyさん03/05/10 19:44ID:???
>>432
マイナス25点ってとこだな。なぜマイナスかと言うと、使うと損するくらい
まともに処理できてないからな。

まア、80点以上が出たらわたしのほうから正解を書くとしよう。
0436nobodyさん03/05/10 20:18ID:???
確かにセンスなさげだ
0437nobodyさん03/05/10 20:32ID:???
>>432
String#scan 使うとめっちゃ簡単に書けるよ。
0438nobodyさん03/05/10 20:33ID:???
>>437
Ruby 厨 キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
0439nobodyさん03/05/10 22:59ID:???
>>437
やってることは同じだし、正規表現を使わないといけない所も同じ。めっちゃって言うほど簡単になるか?
0440nobodyさん03/05/10 23:28ID:???
これでええやん。堕落かもしれないけど。

HTML::LinkExtor->new(
sub {
 my ($tag, %attr) = @_;
 push @links, values %attr;
}
)->parse(\$list);

print "$_\n" foreach @links;
0441nobodyさん03/05/10 23:40ID:???
正規表現版は、とりあえず、、
print "$1,$2\n" while $list =~ m#<a href="([^"]+)">([^<]*)</a>#ig;
これで妥協して。
0442nobodyさん03/05/11 00:24ID:???
href=''の場合もあるとか言いたいけど、我慢。
0443nobodyさん03/05/11 00:41ID:???
<a hoge='hoge href="http://"' href = 'http://'>;<!-- hogehoge </a> -->hogehoge</a>の場合も…略
044443503/05/11 01:12ID:???
>>441
まア、それでも60点ってとこだな
0445センスのない43203/05/11 07:00ID:???
>441氏(神)のやつを参考にしたところ、うまくいった模様です。
name="" id="" class="" target="" 等が入った場合にも対応できたので、
とりあえずこれで良しとします。ありがとうございました。>434-444
044640503/05/11 10:38ID:QXPmJshp
ケツの</a>みてないけど、
m#<a.+?\s*href\s*=.+?\s*>#ig
あたりでどう?

<a name="" target="" href="http://hoge">
ってケースもある。
044743503/05/11 11:05ID:???
>>446
50点ってとこだな
0448nobodyさん 03/05/11 12:33ID:???
http_regx使っていいの〜?
0449nobodyさん03/05/11 14:25ID:QXPmJshp
>>448
いいよ
0450nobodyさん03/05/11 15:26ID:???
open FILE, $file or die $!;
read(FILE, $doc, -s FILE);
while( $doc =~ m|<a.*?/a>|isg ){
my $temp = $MATCH;
$temp =~ s/\n//g;
print $temp,"\n";
}

close FILE;
045143503/05/11 16:12ID:???
>>450
<applet><a href="hoge">abc</a>
<address><a href="hoge">abc</a>
<area><a href="hoge">abc</a>

あらゆる可能性も考慮しないと・・・30点
0452nobodyさん 03/05/11 16:24ID:???
{
  my @tag = $_ =~ m/<a([^>]).>/g;
  @uri = map{ m/($http_regx)/; $1; } @tag;
}

$http_regxは自分で調べること
0453nobodyさん 03/05/11 17:16ID:???
>>452訂正
{
  my @tag = $data =~ m/<a([^>].)>/g;
  @uri = map{ m/($http_regx)/; $1; } @tag;
}
0454nobodyさん03/05/11 17:23ID:???
<a [^>]*href=("[^"]+:[^"]+"|'[^']+:[^']+')[^>]*?>
045543503/05/11 17:28ID:???
>>454
 >>451も読んでね。

>>452,>>453は問題外
0456nobodyさん03/05/11 17:45ID:???
>>450
m|<a\s.*?/a>|isg
045743503/05/11 17:56ID:???
>>456
<a name="hoge"><a href="hoge">abc</a>

もうひといき
045845603/05/11 18:01ID:???
>>457
ハァ?<a> はネストしちゃいけないわけですが何か?
0459nobodyさん03/05/11 18:05ID:???
>>458
432> ニュースサイトからアンカータグの部分だけを取得してくる
だから、念には念を入れておくってことで。
046043503/05/11 18:07ID:???
一応IE6のパーサーで95点だから、その辺よろしく。
046145603/05/11 18:10ID:???
>>459
その「念」てなんだよ。点数出すからには採点基準を示せよな。
parse 対象となる HTML の DTD も示せ。BNF でも構わん。
それができないのならこんなの不毛なだけだ。
0462nobodyさん 03/05/11 18:14ID:???
じゃ、コレで如何だよ

my @list = $data =~ /<a(?:[^>]+)?>/g;
@uri = map{ $_=~ /href="?($http_regex)"?/; $1; } grep{/href="?($http_regex)"?/} @list;
046345903/05/11 18:17ID:???
>>461
ごめん、俺は435じゃない。
ネストしないんだからアレでイイと思うんだけど、
ニュースサイトがvalidなHTMLを書いていることは少ないから
「年」って行っただけぽ。
046443503/05/11 18:21ID:???
じゃあ、そろそろ80点以上の例でも示しておこう。

s/<!--.*-->//gs; # 前処理
@gets= $_=~ m!<A\s[^>]*?\bhref=.+?</A>!gsi;

どうだ、、、これで確実に「ゲッツ!」しろYO!
0465nobodyさん 03/05/11 18:25ID:???
>>464
URI以降も含むんでねーのかそれ・・・
046643503/05/11 18:29ID:???
>>465
  >>432嫁

s/<COMMENT>.*</COMMENT>//gs;
s/<!--.*-->//gs;
@gets= m!<A\s[^>]*?\bhref\s*=.+?</A>!gsi;

こんなのがもっと堅実かもな
046743503/05/11 18:30ID:???
間違った。。。iオプションがなくてはな

s/<COMMENT>.*</COMMENT>//gsi;
046843503/05/11 18:36ID:???
まだ間違ってるな

s!<COMMENT>.*</COMMENT>!!gsi;

まったくつくづくだな
046945603/05/11 18:44ID:???
適当にうやむやにごまかそうとしてんじゃねえよ。とっとと「採点基準」を示せよ。
0470あぼーんNGNG
あぼーん
047143503/05/11 18:51ID:???
>>469
だから、<a name="hoge"></a>
   とか
<!--<a href="hoge">--><a href="hoge">abc</a>

とかも考慮すると>>456は68点だな。

採点基準は漏れの直感だ
0472nobodyさん 03/05/11 18:54ID:???
ほれ・・・

s/<!--(?:(?!-->).)*-->//ig;
s/<COMMENT>(?:(?!<\/COMMENT>).)*<\/COMMENT>//gsi;
@gets = m/<a[^>]+href=[^>]*>(?:(?!<\/a>).)*<\/a>/gsi;
047343503/05/11 18:57ID:???
>>472
   できれば>>451を読んで欲しかった

正規表現は冗長になり過ぎると処理が遅くなりにけり
0474nobodyさん 03/05/11 18:58ID:???
なんや・・・
結局イチャモンつけたいだけか・・・
047543503/05/11 19:01ID:???
っていうか、普通に

<area href="url">ってタグあるの知ってる?
047645603/05/11 19:03ID:???
> 採点基準は漏れの直感だ

お前、どっか逝け。
0477nobodyさん 03/05/11 19:03ID:???
@gets = m/<a\s[^>]*href=[^>]*>(?:(?!<\/a>).)*<\/a>/gsi;

じゃ、これでいいんでは?
047843503/05/11 19:05ID:???
>>477
だいぶいい感じだな。できれば最短マッチのほうがシンプルで処理も速いが
047943503/05/11 19:08ID:???
>>476
それじゃ進歩しないぞ。ここは道場だからな。ビシビシいくぞ!
馴れ合いスレじゃないからな。

もちろん漏れが書いたのもまだ不完全なのかも知れん。つっこみどころが
あればつっこんでもっといいものを出せばいいんだ。
0480あぼーんNGNG
あぼーん
048145603/05/11 19:14ID:???
>>479
じゃあ意味の無い点数なんて付けるな。
第一、処理対象となる HTML がどんな仕様なのか前提があいまいで、
あとからコレはダメだアレはダメだなんてのは、
単にいちゃもん付けたいだけとしか思えん。
だったら最初から parse 対象 HTML を全て提示しとけ。
048243503/05/11 19:21ID:???
>>481
いちいち見ず知らずの漏れが付けた点数に反応してどうするよ。
おかしいと思えば無視しろよ。

HTMLの仕様は決まってるだろ。今まで書いたことがいちゃもんだといわれ
ても、漏れがやってるプログラミングの世界ではあらゆる状況を考慮しないと
とんでもないバグになってしまうから、まア職業病だと思ってくれ。
048345603/05/11 19:28ID:???
>>482
> HTMLの仕様は決まってるだろ。

だから漏れが <a> はネストしないって言ったら、 >>457 と言う。
だったらお前の脳内HTML仕様を提示しろと言ってるんだYO!
とんだ職業病だな。
048443503/05/11 19:33ID:???
>>483
確かに、HTML仕様としては>>457はダメだな。>>471を最初から書くべき
だな。ということで68点だな。
0485nobodyさん 03/05/11 19:45ID:???
>>472
だから、わざと冗長な正規表現をかいただけのはなしだが・・・
     ^^^^^^
手前ルールでやられりゃ、腹も立つやろうなぁ・・・
0486あぼーんNGNG
あぼーん
0487nobodyさん03/05/11 20:20ID:???
すげー!変な奴キター!
0488名無しさん@Meadow03/05/12 07:34ID:???
>>487
486みたいな香具師は2chでは普通ですが、何か。
0489nobodyさん03/05/12 07:49ID:???
>>488
>>435のことだよ
0490nobodyさん03/05/12 09:37ID:???
「詳説 正規表現」の第二版が今月下旬に出るみたいだね。
0491nobodyさん03/05/12 10:10ID:???
>>490 diffキボンヌ
0492nobodyさん03/05/12 10:28ID:85k2ng51
前処理でコメントタグ取るなら、
ここまでやるってのはどう?

/<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style|SCRIPT|STYLE)[\s\S]*?<\/(?:script|style|SCRIPT|STYLE)>)/isg;
0493nobodyさん 03/05/12 10:47ID:???
>>492
iつけるんなら、
/<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style)[\s\S]*?<\/(?:script|style)>)/isg;
これでいいんでない?

[\s\S] って .でいいんちゃうかな?
0494nobodyさん03/05/12 10:53ID:85k2ng51
>>493
そうだね、指摘サンクスコ(・∀・)
漏れのソース、i付いてなかった(;´Д`)
0495nobodyさん03/05/12 10:54ID:85k2ng51
とりあえず、コメント削除は、>>493の指摘で完成する物で、かなり逝けると思われ。
ありとあらゆるサイトのコメント入りHTML食わせてみたけど、
まず間違いなく削除してくれる。
100%ではないかもしれないけど。
0496あぼーんNGNG
あぼーん
0497nobodyさん03/05/12 22:56ID:???
サイトによってコメントの定義が違うからな(皮肉
0498nobodyさん03/05/19 22:15ID:pDSpAcPJ
ファイル名だけを変数に取り込む時にフルパスからファイル名だけを取り出す
正規表現はどう書けばいいのでしょうか。
たとえば下のフルパスからhttpd.confだけを取り出すような場合です。
C:\Program Files\Apache Group\Apache\conf\httpd.conf
0499あぼーんNGNG
あぼーん
0500nobodyさん03/05/19 22:36ID:???
>>498
\\([^\\+])$
(\ \以外 末尾)
0501あぼーんNGNG
あぼーん
0502nobodyさん03/05/19 22:58ID:???
>>500
perlなのですがエラーになりました。

-----test.pl------
my $path = $0;
$path =~ \\([^\\+])$;
print "\$path :\n";
print "$path\n";
----------------
0503nobodyさん03/05/19 23:17ID:???
>>502
あたりまえだろう

$path =~ /\\([^\\+])$/;
0504nobodyさん03/05/19 23:23ID:???
>>498

$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /^.+\\(.+)$/;
print;
0505nobodyさん03/05/19 23:26ID:???
>>503
すいません。
改めて試しましたがファイル名test.pが取得できません。

-----test.pl------
my $path = $0;
print "$path\n";
$path =~ /\\([^\\+])$/;
print "\$path :\n";
print "$path\n";
----------------
050650003/05/19 23:33ID:???
すんません。typoです。
× \\([^\\+])$
○ \\([^\\]+)$

>>505
typoに関係なくそのスクリプトは間違っている。
もう一回本読め。
0507nobodyさん03/05/19 23:42ID:???
>>504
さっそく試してみました。
しかしフルパスが入ります。
環境は98です。

-----test.pl------
my $path = $0;
print "$path\n";
$path =~ /^.+\\(.+)$/;
print "\$path :\n";
print "$path\n";
----------------

>>506
ダメでした。
スクリプト自体が間違っていますか?
-----test.pl------
my $path = $0;
print "$path\n";
$path =~ /\\([^\\]+)$/;
print "\$path :\n";
print "$path\n";
----------------
050850403/05/19 23:45ID:???
>>507
資源の無駄だからもう書き込むな
スレが汚れる
0509nobodyさん03/05/19 23:48ID:???
>>508
すいません。
>>504の正規表現でhttpd.confが拾えました。
あとはスクリプトの間違いを修正してみます。
0510nobodyさん03/05/19 23:52ID:???
頭の固い香具師だな
0511nobodyさん03/05/20 00:17ID:???
>>509
>>>504の正規表現でhttpd.confが拾えました。
>>506の正規表現でも拾えてる。
0512nobodyさん03/05/20 00:33ID:???
>>511
500へのお礼を忘れてました。
確かに拾えます。
ですがまだ不具合があるので両方の正規表現を使って試している最中です。

-----test.pl------
my $path = $0;
print "$path\n";
($_)= $path =~ /\\([^\\]+)$/;
print "\$path1 :\n";
print "$_\n";

$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /^.+\\(.+)$/;
print;
----------------
0513nobodyさん03/05/20 00:38ID:???
編集途中のソースが残っていたのでもう無視して下さい。
0514nobodyさん03/05/20 01:10ID:???
フルパスで入力した場合は下のような値が入るので問題ないのですが
$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
perl test.plというようにカレントディレクトリから実行して下のような値が入った場合はファイル名を取得できません。
$b='httpd.conf';

$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
$b='httpd.conf';
両方の値からhttpd.confだけを抜け出せないでしょうか。
スレ汚しで申し訳ないです。
0515nobodyさん03/05/20 01:11ID:???
#---------------test.pl----------------
my $path1 = $0;
print "$path1\n";
($_)= $path1 =~ /\\([^\\]+)$/;
$path1 = $_;
print "\$path1 :\n";
print "$path1\n\n";

my $path2 = $0;
print "$path2\n";
($_)= $path2 =~ /^.+\\(.+)$/;
$path2 = $_;
print "\$path2 :\n";
print "$path2\n\n";

$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /^.+\\(.+)$/;
print "\$a :\n";
print;
print "\n";
$b='httpd.conf';
($_)=$b=~ /^.+\\(.+)$/;
print "\$b :\n";
print;
#--------------------------------------
0516nobodyさん03/05/20 09:12ID:???
$path =~ /([^\\]\+)$/
print "$1";

っていうか use File::Basename; 使え。
051751503/05/20 12:28ID:???
>>516
ありがとうございます。
皆さんのおかげで完成しました。
use File::Basename; も調べてみます。
051851503/05/20 12:30ID:???
#---------------test.pl----------------
my $path1 = $0;
print "$path1\n";
($_)= $path1 =~ /\\([^\\]+)$/;
$path1 = $&;
print "\$path1 :\n";
print "$path1\n\n";

my $path2 = $0;
print "$path2\n";
($_)= $path2 =~ /^.+\\(.+)$/;
$path2 = $&;
print "\$path2 :\n";
print "$path2\n\n";

my $path3 = $0;
print "$path3\n";
($_)= $path3 =~ /[^\/\\]+$/;
$path3 = $&;
print "\$path3 :\n";
print "$path3\n\n";

my $path4 = $0;
print "$path4\n";
($_)= $path4 =~ /([^\\]\+)$/;
$path4 = $&;
print "\$path4 :\n";
print "$path4\n\n";
#--------------------------------------
051951503/05/20 12:33ID:???
#---------------test.pl----------------
$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /[^\/\\]+$/;
print "\$a :\n";
print "$&\n";
print "\n";
$b='httpd.conf';
($_)=$b=~ /[^\/\\]+$/;
print "\$b :\n";
print "$&\n\n";

$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /([^\\]\+)$/;
print "\$a :\n";
print "$&\n";
print "\n";
$b='httpd.conf';
($_)=$b=~ /([^\\]\+)$/;
print "\$b :\n";
print "$&\n";
#--------------------------------------
スレ汚しに付き合って頂いて感謝でした。
0520nobodyさん03/05/20 12:47ID:ridin1oO
>>515

use File::Basename;
$path = 'C:\Program Files\Apache Group\Apache\conf\httpd.conf';
$file = basename($path);
print $file;
0521あぼーんNGNG
あぼーん
0522山崎渉03/05/22 01:59ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
0523nobodyさん03/05/25 03:32ID:???
山崎のせいで落ちるところだったわ
0524あぼーんNGNG
あぼーん
0525山崎渉03/05/28 17:06ID:???
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0526nobodyさん03/06/06 19:09ID:GD1DFdBg
文字クラスで、半角英数字とクエスチョンそのものは、
[a-zA-Z0-9,\?]
で良いのでしょうか。

やりたいことは、↓です。
function check($address){
 if ( ereg("^[a-z,A-Z,0-9,\(,\),\.,\_,\/,\+,\?,\-]+@[^.@!\"#$%&'()~^|]+\.[^@!\"#$%&'()~^|]*[^.@!\"#$%&'()~^|]$", $address)){
  return true;
 }
 else{
  return false;
 }
}

$email_1 = "a(a)a?_s-/[email protected]";
$email_2 = "a(a)a_s-/[email protected]";

$email_1も$email_2もtrueが返ってきてほしいのに、
$email_2のみがtrueで返ってきます。。
?そのもにをマッチさせるにはどうすれば良いのでしょうか。

0527あぼーんNGNG
あぼーん
0528nobodyさん03/06/07 00:42ID:???
>>526
PHP だよね?漏れのところ (PHP 4.3.1) ではどっちも true が返るよ?
0529nobodyさん03/06/07 18:56ID:???
>>526
横槍スマソ。
これじゃ駄目かい? ttp://www.din.or.jp/~ohzaki/perl.htm#Mail
053052603/06/09 10:45ID:???
>>528
はい。PHPです。どちらもtrueが返るようになりました。
原因は、「if ( ereg("^[a-z,〜〜〜」を通す前にさらにチェックしていてそこで引っかかっていました。
正規表現とは関係なくてすいませんでした。

>>529
そこはperlだったのですが参考になりそうなページでした。ありがとうございました。
0531yoko03/06/10 13:46ID:QvCU0It/
秀丸でやろうとしているんですが、無理でしょうか?

以下のような形式のテキスト ファイルを扱っています。生徒から備考までを
1 ブロックとして、生徒番号 800 までのブロックがあります。本当は XML か
CSV で管理するべきだと思うので近いうちに変換する予定です。

生徒: 1名前: 田中得意科目: 数学苦手科目: 古文備考: 2 学期より編入

生徒: 2名前: 山田得意科目: 国語苦手科目: 世界史備考: 模試未受験

生徒: 3
..

今正規表現をつかって各データの手直しをしているのですが、とても簡単なと
ころでつまづいています。
"生徒: 2" から "生徒: 2." という具合に、生徒行の数字の後ろにピリオドを
つけたいのですが、どのような表記で置換処理をしていいのかわかりません。
"生徒: [[0-9]+|[02-9]]" で "生徒:" とその数字部分を検索でヒットするこ
とはできるのですが、これを "生徒: [[0-9]+|[02-9]]." で置換しても "生徒:
[[0-9]+|[02-9]]." に入れ替わるだけです。大きな勘違いをしているとは思
うのですが…正規表現の資料をみてもここから先に進むことができません。
すごくつまらない質問だとは思いますが、どなたかみていただけないでしょう
か。

0532yoko03/06/10 13:48ID:???
↑のテキストの部分おかしいですね。
書き直します。

生徒: 1
名前: 田中
得意科目: 数学
苦手科目: 古文
備考: 2 学期より編入

生徒: 2
名前: 山田
得意科目: 国語
苦手科目: 世界史
備考: 模試未受験

生徒: 3
..
0533nobodyさん03/06/10 13:56ID:wps94Nox
CSVファイルに

AAAAA http://www.a.com/
BBBBB http://www.b.com/
CCCCC http://www.c.com/

というタイトルとURLのペアのファイルがあるとします。
で、例えば

「AAAAAはBBBBBでCCCCC」
というテキストを
「<a href="http://www.a.com/">A</a>は<a href="http://www.b.com">〜」
みたいに変換したいです。

上記のペアでしたら、順に検索して置換すれば済むことですが、もし
最後の方に下記みたいなペアがあると
href http://www.href.com/

「<a <a href="http://www.href.com">="http://www.a.com〜」
のように変換されてしまいます。

こういう場合はどうすればいいんでしょうか?
できればそれぞれの置換したい単語が元のテキストを参照できるようにしたいです。

0534nobodyさん03/06/10 14:34ID:???
>>531-532
おそらく秀丸のヘルプ嫁。かと。
正規表現の互換があるかどうか判らないが Perl だと、
s/(生徒: \d?\d)/$1\./g; 等。

>>533
チョソなのでニポンコよくわからないてす。
ニポンコむつかしにだ。
0535nobodyさん03/06/10 23:58ID:???
>531-532
ヘルプ開いて「タグ付き正規表現」というのを読めば幸せになれるかと
0536nobodyさん03/06/11 01:31ID:???
>>533
#!/usr/local/bin/perl

my $text = "AAAAAはBBBBBでCCCCCなhrefさ";

my %dictionary = (
"AAAAA" => "http://www.a.com/",
"BBBBB" => "http://www.b.com/",
"CCCCC" => "http://www.c.com/",
"href" => "http://hre.f.com/",
);

my $pattern = join('|', map { quotemeta($_) } keys(%dictionary));
$text =~ s/(${pattern})/<a href="$dictionary{$1}">$1<\/a>/g;

print "[$text]\n";
0537nobodyさん03/06/11 02:54ID:???
あ、キーは長い順に sort しなきゃダメかな。まいっか。
0538yoko03/06/11 13:19ID:FQ/QXZet
>>535
ありがとうできました!

チュパ (←フェラ)
0539yoko03/06/11 13:20ID:???
>>534
チュパ♪
0540nobodyさん03/06/11 13:54ID:???
>>537
チュパ(←カブラ)
0541nobodyさん03/06/11 14:04ID:???
>>537
チュッパ(←チャップス)
0542nobodyさん03/06/11 16:25ID:u2aqyjyI
解決せぬまま、日が変わってしまいました。
すみません、一つ質問させてください。

HTMLファイル内のアンカータグで指定されているURLを全てエンコードして返すコードを書きましたが、どうも思う
ように動いてくれません。問題のコードは下記となっております。
-----------------------------------------------------
while(<FH>){
  if($_ =~ /\<a.*?href.*?\=.*?\>/ig){
    my $tmp = $_;
    while($tmp =~ /(.*\<a.*?href.*?\=)(.*?)(\>.*?)(\<|\n)/ig){
      my $tmp1 = $1; my $tmp3 = $3;
      my $tmp2 = main::url_encode($2);#エンコードルーチン
      $tmp2 =~ s/\%20//g; $tmp2 =~ s/\%22/\"/g;
      $index_file .= $tmp1 . $tmp2 . $tmp3;
    }
  }
  else{
    $index_file .= $_;
  }
}
-----------------------------------------------------
1行に2つ以上のアンカータグがあった場合を考えてwhileを使用しておりますが、その部分の正規表現に問題が
あるというところまでわかっていながら、全く前進せぬまま日が変わってしまいました。情けないです。
ここの正規表現の区切りとなるものが曖昧なことから、うまく認識してくれず、整形後のHTMLファイルがおかしく
なってしまっているのだと思われます。

もし宜しければ、教えてください。
すみませんが宜しくお願いいたします。
0543nobodyさん03/06/11 16:35ID:???
>>542
誤爆か●朕か悩むところ。
0544nobodyさん03/06/11 19:24ID:???
>>542 ヒント

$reg "s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]";

while ( $txt =~ /$reg/g ) {
 .
 .
 .
}
0545nobodyさん03/06/11 20:35ID:???
>>544
貴重なヒント感謝です。
しかし、厨房な私にはどうも理解できていないみたいです。
せっかくのヒントをいただきながら、本当に申し訳ありません。
0546nobodyさん03/06/12 04:14ID:???
>>545 ヒントその2
ttp://www.din.or.jp/~ohzaki/perl.htm#httpURL
0547nobodyさん03/06/13 23:26ID:sIi8OqiB
(\$|\%|\@)[^a-zA-Z]*?
↑このような正規表現の場合、これは
頭が"$"or"%"or"@"のいずれかから始まって
続いて、アルファベット以外が来る場合。だと思うのですが?
最後の*?はどういう意味でしょうか?
*は0字以上、?は0か1だと覚えているのですが・・・
054854703/06/13 23:27ID:???
あ、ちなみにこれは秀丸エディタで
強調表示するためのものです(perl版)。
0549nobodyさん03/06/13 23:32ID:???
最短マッチは、その後にパターン指定がなければ使う意味がなきにけり
0550nobodyさん03/06/14 00:26ID:???
秀丸の正規表現に最短マッチはなかりけり。
055154703/06/14 00:29ID:???
最短マッチで検索してみました。
.*hogeに対して
.*?hoge
は、検索対象に対してhogeがヒットした一番最初の部分を
取るという事ですね!
例えば
hogeXXhogeXXhoge
の場合後者は最初のhogeでマッチ。前者は
3つめのhogeでマッチ!
という事ですね!?

055254703/06/14 00:32ID:???
>>550
そ、そうなんですか!?
http://hidemaru.xaxon.co.jp/lib/hilight/perl_php.html
この作者のミスという事でしたか・・・。
しかし勉強になりましたです。
ありがとうございました。
0553nobodyさん03/06/15 21:39ID:mUOjbxbY
test.htmlの中身が

<!-- $aaa --> <!-- $bbb -->

と記入されていて、cgi本体で
$aaa = 'aaaの中身';
$bbb = 'bbbの中身';

と定義されている時
test.datをopenし

while(<FH>){
  正規表現で$aaaなどの頭に$がついてるのを定義されている変数と置き換える
}

とするにはどうすれば良いでしょうか?
0554nobodyさん03/06/15 22:16ID:???
ない知恵を絞って考えてみましたが、どんなもんでしょう。
とりあえず、下のスクリプトで動くには動きますが。。。

$aaa = "あ";
$bbb = "い";
$ret = "\$aaa\$bbbb";

$Hash{'\$aaa'} = $aaa;
$Hash{'\$bbb'} = $bbb;
while(($key,$value)=each %Hash){
$ret =~ s/$key/$value/;
}
print "$ret\n";

#実行すると「あいb」と表示される。
0555nobodyさん03/06/15 22:18ID:???
>>553
意味わからん
ファイルがどうこうなんてスレ違いだ
正規表現で何をどう置き換えたいのかだけはっきりせよ
055655303/06/15 23:18ID:/un8khu+
>>554
おぉ〜どうもありがとう。
参考にさせてもらいます。
>>555
出し惜しみせずに書いたつもりでしたが・・・シンプルに書き直します↓

$bbb = 111;
$ccc = 222;
$aaa = 'XXX $bbb XXX $ccc XXX';

print なにか

出力結果
XXX 111 XXX $ccc XXX

というのをやりたいです。また$aaa に含まれる変数名 例$bbbなど
は1つだったり3つだったりとするので一般化したいです。

0557nobodyさん03/06/15 23:31ID:???
>>556
正規表現というより、どっちかといえばperlのコーディングのほうがメインだな。
他でやってくれ。
0558nobodyさん03/06/15 23:32ID:???
>>556
#!/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);
055955303/06/15 23:49ID:/un8khu+
>>557
う・・・そうでしたか。。スマソです。
>>558
おぉおぉ〜どうもありがとうございます。
勉強になりました。
多謝!!
0560nobodyさん03/06/16 00:49ID:???
>>558=バカ
056155803/06/16 01:26ID:???
>>560
漏れも自分でそう思った。
0562nobodyさん03/06/16 03:58ID:???
なぜ?
0563nobodyさん03/06/16 05:58ID:???
>>557だから。
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:???
>>565
perlの場合はこんな感じかな。(変換前のHTMLが間違ってるけどそれでOKという前提で)

s/(<a name=")(\d+)(<\/a>)/$1$2">$2$3/;
0567nobodyさん03/06/19 10:51ID:???
http://2ch.net/
http://www.2ch.net/
http://www2.2ch.net/
上のすべてに対応するためにはどのように書いたらいいのでしょう?

http://(www\.|www2\.)?2ch\.net/

???
0568nobodyさん03/06/19 10:56ID:bERWsbmj
正気表現とオートマトンはどのような関係にあるんですか?
0569nobodyさん03/06/19 11:13ID:???
>>568
友達以上恋人未満
0570nobodyさん03/06/19 12:11ID:???
>>568
like以上love未満
0571nobodyさん03/06/19 19:38ID:???
>>567
それでいいんじゃないの?何かおかしい?
057256503/06/19 21:37ID:???
>>566
レス遅れてすみません凹
早速、やってみたんですが
思ったように出来ませんでした(>_<)

それと申し遅れましたが、自分
「speeeeeed」というソフト使ってるんですが
このソフトで正規表現を使った置き換えが
出来たらうれしいんです。

わがまま言ってすみません。。
0573nobodyさん03/06/19 21:45ID:???
speeeeeed じゃなくて speeeeed だろ。
BREGEXP.DLL導入すれば正規表現使えるって書いてあるから導入すればいいんじゃないのん?
やりかたはHELPに書いてあった。
057456503/06/19 21:58ID:???
>>573
すいません「e」が一個多かったですね^^;
はい、BREGEXP.DLLは導入済みなんですが
正規表現の構文?がわからないので・・・(涙
057551503/06/19 22:15ID:???
>>574
勉強すればわかるようになる。
とりあえず自分で調べてみな。
0576nobodyさん03/06/19 23:04ID:???
ホスト名にマッチする正規表現は知りませんか?
0577nobodyさん03/06/19 23:21ID:???
>>576
ホスト名には決まった書式はないので無理
057857603/06/20 00:11ID:???
ども。576です。
取り敢えず、簡易ながら
\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+
で落ち着いきたく思うのですが、
ENVの中のHTTP_FROMとかHTTP_SP_HOST内で使うには問題ありませんでしょうかね‥?
057957603/06/20 00:13ID:???
スミマセン。
[\da-zA-Z\-](?:\.[\da-zA-Z\-])+
デス。
0580nobodyさん03/06/20 00:35ID:???
HTTP_FROMやHTTP_SP_HOSTにホスト名が入ることはないのに?
0581nobodyさん03/06/20 00:55ID:???
マジで?
でも、HTTP_SP_HOSTはHOSTと書いてある時点で入る可能性は否定出来ないのでは?
0582nobodyさん03/06/20 01:04ID:???
入るよ
0583nobodyさん03/06/20 01:15ID:???
痛いよ
058457603/06/20 01:28ID:???
今度はe-mailにはマッチしないようにしようとしたのですが、
[^@]\b([\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+)\b[^@]
これでは対象が先頭から始まる場合、もしくは末尾で終わる場合にマッチしません‥
ダサイ回避策として、検索する文字列に予め先頭と末尾にスペースを入れるという方法がありますが、
正規表現のみで解決する良い手段はないでしょうか???
0585nobodyさん03/06/20 01:38ID:???
HTTP_FROMやHTTP_SP_HOST内で使うっていうなら他のものが
入ることはないでしょ。

何が含まれているかわからない中からホストを完璧にマッチさせる
正規表現は不可能だし、メールアドレスもまあまあマッチすれば
いいなら、過去ログであったはず。
058657603/06/20 01:44ID:???
ども。ども。
なんとか自己解決しました。
一応どんなものになったかカキコしておきますね。
(?:^|[^@]\b)([\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+)(?:\b[^@]|$)
0587nobodyさん03/06/20 01:51ID:???
よくわからん。
ホスト名にマッチするようにしたら、
メールアドレスにマッチするわけないと思うのだが・・・
058858703/06/20 01:53ID:???
あ、いや、そんなことないか。勘違いだ。スマソ
058956503/06/20 07:31ID:???
>>575
レスありがとうございます。
そうですね!
とりあえず、いろんなサイト見て勉強してみます!
0590nobodyさん03/06/20 07:55ID:???
>>589
Perlメモ見てみれば?
0591あぼーんNGNG
あぼーん
0592nobodyさん03/06/21 02:30ID:???
PHPでリンクの置き換えに困ってます。例えば

<a href="../test/read.cgi/mysv/1044358074/115" target="_blank">>>115</a>

で、URL部../test/read.cgi/mysv/1044358074/115と >> より後の数字を不特定で
マッチさせたいのですがどう表記すればよいでしょうか。お願いします。
0593nobodyさん03/06/21 06:56ID:???
>>592
<a href="([^"]+?)" target="_blank">>>(\d{1,3})</a>
みたいな?
0594nobodyさん03/06/21 10:24ID:???
>>593
"は\"に変えましたけどそれでもエラーなります
0595nobodyさん03/06/21 11:57ID:NfKIfdiT
csvの分解ってPerlの正規表現一発でできますか?
aaa,"bbb,ccc",ddd
とかも正しく分解できる奴
059659503/06/21 12:00ID:???
Perlメモにありましたね
失礼
0597nobodyさん03/06/22 03:04ID:pHsSEvkK
PHPの質問スレッドにてこちらのほうがいいと言われましたんでこのスレにきました

ページ内からリンクとリンクを張られた文字を全て取得したいのです
このスレの>>432に似てるのですが、張られた文字も取得したいのです

例えば、<a href="URL">文字列</a>だったら「URL」「文字列」の両方です
自分でもいろいろやってみたのですが、上の例のような形のモノしか取得できません
もう少し、柔軟に取得できるものがいいのですが

preg_match_all ("|<a href=\"([^>]+)\">([^<]+)</a>|U", $contents, $out, PREG_SET_ORDER);

私にはこれが限界です、よろしくお願いします
0598nobodyさん03/06/22 04:17ID:???
PHPじゃないんだが。。。

<a\s[^>]*?href="((https?|ftp):\/\/[-!\#\$%&'()*+,.\/:;=?\@~\w]+)"[^>]*?>([\s\S]+?)<\/a>
059959703/06/22 04:51ID:???
>>598
ありがとうございます。
できれば下のに対応できるくらい柔軟なものってできませんか?


<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>

(最後はわかりやすいよう全角スペースにしてます)
0600nobodyさん03/06/22 08:54ID:???
>>599
テストしながら自分で改良しろよ…ヤレヤレ…
0601nobodyさん03/06/22 10:40ID:???
>>599
HTMLの仕様から考えると「考えなくて良い」ものもあるが
それにも対応すると?
0602nobodyさん03/06/22 11:09ID:???
>>599
そういうのは柔軟じゃなく薄弱と言うんだ
0603nobodyさん03/06/22 14:27ID:???
//
/* */
からなるコメント文を消すには、どう書けばいいんですか?
060459703/06/22 16:22ID:???
この道場冷たいなあw
ちょっとくらい稽古つけてくださいよ
こんな感じで頑張ってはいるんですよ

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:???
>>604
「aをスペースで囲む」ってのに対応するのはナンセンスな気がするな。

つーか、正規表現一つで処理せなあかんの?

"#<a[^>]*\shref\s*=\s*(?:\"([^\"]+)\"|'([^']+)'|(\S+))[^>]*>(.+?)</a>#i"
0606nobodyさん03/06/22 18:22ID:???
>>604
お前は相手にされない
060760303/06/22 18:24ID:???
<a href=""> と決め打ちするのはどうして?

<a alt="" href=""> はありえないことが確定してるの?
0608nobodyさん03/06/22 18:29ID:???
<a>にaltはないが、titleとかclassなんかはありえるな。
0609nobodyさん03/06/22 20:57ID:???
[<\s]+a [^>]*href[\s=]+(?:"([^"]+)"|'([^']+)'|([^\s>]+))[^>]*>(.+?)</a>
0610nobodyさん03/06/22 23:44ID:???
<A
    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 で充分過ぎるほどヒント出てるんだから、自分で「正規表現」を
習得しつつコードを書こうという気は起きないのかい?
061359703/06/23 02:57ID:???
どうせ正規表現をつかって作るのなら柔軟なものを、と思っています。
今まで見てきたHTMLで「文法はおかしいけれどありそうなもの」
「このくらいならありえるかな」ってのを>>599にいくつかピックアップしてみました
ちょっとありえないものもあるかもしれません

万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
>>599のリストに、他にもありえそうなものを追加して……
0614nobodyさん03/06/23 03:03ID:???
出来たら教えてくれ。
とりあえずそろそろウザイ。
061559703/06/23 03:11ID:???
>>614
スマソ

とりあえず>>599から>>605にあるように「aをスペースで囲む」を無くして
>>610にも対応したもの

#<a[^>]*\shref\s*=\s*(?:\"([^\"\s]+)\"|'([^'\s]+)'|([^>\s]+))[^>]*>(.+?)</a>#i
0616nobodyさん03/06/23 03:23ID:???
なんで今さらリンクの正規表現なんか作らにゃならんのだ・・・
0617nobodyさん03/06/23 03:51ID:???
>>615
</a>で閉じられてない奴とか<,>の前後の空白とか
"(ダブルクォート)じゃなくて'(シングルクォート)だったり
061860503/06/23 05:02ID:???
>>615
センスねぇな・・・
0619nobodyさん03/06/23 05:27ID:???
>>615
・hrefの前に>があったら失敗するな(ex. title="<1>")
・行に2つ以上anchorがあったら1つめのマッチングで
 最後の</a>までマッチしそうだ
まあがんがれ
0620nobodyさん03/06/23 05:31ID:???
>>619
ああ、.+?って最小マッチってやつっすか。。。スマソ
0621nobodyさん03/06/23 14:28ID:???
>>615
>・・・(.+?)</a>#
(.+?)の部分に<!-- </a> -->が入ってたら?
0622nobodyさん03/06/23 18:33ID:???
正規表現だけで完璧なものを作ろうと思ってもむるなんじゃない?
0623nobodyさん03/06/23 18:50ID:???
おれもむるだと思う。
0624nobodyさん03/06/23 18:56ID:???
小魚が取れればいい網をクジラやプランクトンまで対応しようと無駄なコストを
062559703/06/23 18:57ID:???
>>617
</a>で閉じられてないってのはどういうことっすか?
「< /a >」だとか「</a <!-- /ここまで -->>」とかですか?

リンクを正規表現で抽出する前に、コメントを取り除いたほうがいいですよね
それとも男なら一度にやるべきでしょうか……

PHPなら「アンカータグ以外を取り除く」なんて簡単に出来ちゃいますし
062659703/06/23 19:29ID:???
< /a>と title="<aaa>" はブラウザがうまく表示できないみたいなんで(IE6のみ確認)
対応しなくてもいいかな、と思いつつ一応やってみたら

<a title="<aaa>" href="http://www.aaa.aaa">他要素の中に<>がある</a>
<a href="http://www.aaa.aaa"><!-- リンク </a> -->文字列にコメントがある</a>

のようなものも上の正規表現で問題なく抽出できました、なんでだろう?w
062759703/06/23 19:32ID:???
上は「< /a>」ではなく「< /a >」の誤りですスマソ
「< /a>」はIE6で正常にリンクされてます。

仕様よりもIEを基準にするな!って怒らないでくださいね
0628nobodyさん03/06/23 19:43ID:???
世の中のふつーのブラウザは、
<a> が明らかに閉じてるべきとこまではリンクと見做してくれてるんでしょ。
アフォな HTML 作成者を救うために。

ところで、パレートの法則って知ってる?
つーか、アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
0629nobodyさん03/06/23 20:43ID:???
たのむからHTMLを真剣に勉強してくれ。
IE?いつまでバカブラウザをマンセーしているつもりだよ(つД`)
<a>はインライン要素。
http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/links.html#edef-A
0630nobodyさん03/06/23 22:32ID:???
>>628
>アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
だけどこの質問者は「万能な」ものを求めてる。
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+X
↑補足です。すいません、Jakarta-OROでもいいっす(Perl5ね)
0634nobodyさん03/06/24 00:58ID:???
またくれくれか。もううんざり。
0635nobodyさん03/06/24 01:39ID:???
splitで取得してやったぜ!

$line10 = (split(/\n/, $text))[9];
0636nobodyさん03/06/24 01:54ID:???
>>632




それのどこが「正規表現」なのかと(ry





0637nobodyさん03/06/24 02:08ID:???
>>636




それのどこが「>>632宛」なのかと(ry





0638nobodyさん03/06/24 03:09ID:???
なんでもかんでも正規表現使えばいいと思ったら大間違いなわけだが。

/\A((?:.*\n){0,10})/m
0639名無しさん@Meadow03/06/24 07:35ID:???
>>638
\Aて何?Perlじゃないでそ。

0640nobodyさん 03/06/24 09:10ID:???
>>639
文字の最初だよ・・・

ttp://www.kt.rim.or.jp/~kbk/regex/regex.html

見て勉強しなおしなされ
0641名無しさん@Meadow03/06/24 10:27ID:???
>>640
べんきょ足りんですた。逝って来マウス。
0642nobodyさん03/06/24 13:05ID:???
>>626
title="<aaa>"は正当だよ。
title="&lt;aaa&gt;"と書かれていたときはtitle="<aaa>"と
解釈しなくてはならないが、title="<aaa>"と書いてはいけないという
意味ではない。&を&amp;と書かないと誤解釈する可能性が
あるという問題とごっちゃにされてるんだろうな。
0643nobodyさん03/06/24 13:10ID:???
謎HTMLでも抽出したいと思うのは勝手だが
それならせめてどういう謎HTMLも許容したいのか
仕様を明確にしてくれないと作りようがない。
0644nobodyさん03/06/24 14:07ID:???
つまりHTMLの仕様を無視した偽HTMLの仕様を書け、ということですな。
0645nobodyさん03/06/24 14:07ID:???
今、>>643 が良いこと言った。
というわけで、以後、要求仕様を明確にしてないお題は放置で。
0646nobodyさん03/06/24 14:14ID:???
>>645
勝手に仕切んなよ。ヴォケが。
0647nobodyさん03/06/24 14:18ID:???
>>646
名前が597じゃなくnobodyさんになってるぞ?
0648nobodyさん03/06/24 16:44ID:???
>>646 = >>597
0649nobodyさん03/06/24 18:14ID:???
>642
(゚Д゚≡゚Д゚)エッナニナニ?本当か?
0650nobodyさん03/06/24 18:25ID:???
>できれば下のに対応できるくらい柔軟なものってできませんか?
とか
>万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
みたいな他力本願なレスは激しく萎える事に>>597は気づいているのかなー?
065159703/06/24 18:45ID:???
>>650
「今更リンクの抽出かよ……」なんて萎える人もいるでしょうが
まあ暇だし付き合ってやるか、という人もいるかなと思ってはじめました
他力本願ですが、道場ということで甘えてみましたw

>>643-645
仕様といっても難しいので、ありえそうなものを考えると
>>599>>610>>626あたりになるのかなって感じです
今出てるものでは>>615ですべて対応できてるはずです

つーか実際に間違ってるHTMLって多いですよね
リンクを抽出することを考えたときに
HTML書いた人に直すようにメールするか
対応した正規表現にするかどっちが早いかって話です
0652nobodyさん03/06/24 18:51ID:???
死ね。ヴォケ
0653nobodyさん03/06/24 18:57ID:???
>>651
これ以上は別スレ立ててやってくれ。
HTML lintのページは参考にならんか?
0654nobodyさん03/06/24 20:56ID:???
>>651
道場で鍛えるのは自分自身だよ。
鍛えている人を眺めているだけでは上達しない。
とりあえず邪魔。
0655nobodyさん03/06/27 13:05ID:???
すみません、ちょっと教えて頂きたいんですけど、
$_ = "w439soz980i505";
@a = /^(?:(\w)(\d{3}|[ao]))+$/;

上のような正規表現で、括弧に入った文字列を全て@aに入れたいんですが、
実際にはループの最後の"i"と"505"だけしか入りません。
全てを@aに入れる方法はあるんでしょうか?
0656nobodyさん03/06/27 14:07ID:???
>>655
@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:???
Perl5の正規表現で
$fn =~ s/\W/\0/g;
$fn =~ s/\0/\|/g;
は、一体どういう処理をしているのか判る方いませんでしょうか
0658nobodyさん03/06/27 23:17ID:???
>>657
単語構成文字(_a-zA-Z0-9)以外の文字が | に置き換わる。
065965503/06/28 00:06ID:???
>>656
レスが遅れてすみません。
どうもありがとうございました。参考になりました。
0660nobodyさん03/06/28 04:40ID:???
なんで
$fn =~ s/\W/\|/g;
じゃないんだろう
0661nobodyさん03/06/28 04:59ID:???
\Wがなくて\0だけあったときでも置き換えられるように
0662nobodyさん03/06/28 05:20ID:???
>>658
うーんなるほど。\|を変に難しく考えてました。
回答ありがとうございます。
0663nobodyさん03/06/28 08:45ID:???
>>657
あ、ごめん。\0 って null 文字の事?
0664nobodyさん03/06/28 19:23ID:???
\0=\000
0665nobodyさん03/06/29 09:15ID:???
\0=\000=\x00
0666nobodyさん03/06/30 16:02ID:???
>>661
\0って\Wに含まれないの?
0667nobodyさん03/06/30 16:44ID:???
含まれないだろ。多分…
0668nobodyさん03/06/30 17:10ID:???
>>667
多分じゃねーよ。ちゃんと調べろよ。

print "MATCHED\n" if ("[\0]" =~ /^\W+$/);
0669nobodyさん03/06/30 17:12ID:???
めんどくせ ヽ(´Д`;)ノ
0670nobodyさん03/07/03 21:15ID:???
保守
0671nobodyさん03/07/08 23:40ID:???
>>662
Perlの場合記号に\付けてもメタ文字にならない
このスレはPerlとは限らんが
0672nobodyさん03/07/10 13:41ID:???
2143184 といった数字の羅列を
2,143,184という風に3桁ごとにカンマを入れるにはどうしたらいいですか?
おしりからマッチさせることができれば簡単なんですが。

この桁数だと,

/^([0-9]{,2})([0-9]{3})([0-9]{3})$/
を
\\1\,\\2\\3

としたらできるんですが,もっときれいにできる方法を教えてください
067367203/07/10 13:50ID:qpJaCER1
× \\1\,\\2\\3
○ \\1\,\\2,\\3
0674nobodyさん03/07/10 14:00ID:???
>>672
ttp://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma
0675nobodyさん03/07/10 14:23ID:???
>>674
Thx
つまり回すと言うことですね
0676あぼーんNGNG
あぼーん
0677山崎 渉03/07/15 11:08ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0678nobodyさん03/07/15 22:27ID:bkNlTgQn
Perlの掲示板の書き込みで、>が先頭に来た書き込みを<blockquote>で囲むため、
$str =~ s/(^|<br>)>.*?(?=<br>|$)/<blockquote>$&<\/blockquote>/g;
$srt =~ s/<\/blockquote><blockquote>//g;
このような正規表現を書きました。
でもなんかスマートではないので、
上記二つのをまとめて表すにはどうすればいいのでしょうか?
0679nobodyさん03/07/16 00:28ID:???
$line =~ s/^(..)(...)//;
正規表現してください,お願いします。
0680nobodyさん03/07/16 00:42ID:???
先頭って何だ?

つか何でblockquote?
0681nobodyさん03/07/16 01:55ID:???
>>680
「引用」だから。
0682nobodyさん03/07/16 01:58ID:???
>>681
中途送信鬱。

>>678
行頭の「>」で加工したいのなら、一旦行ごとに配列にいれてから加工してみてはどうぢゃろ?
0683nobodyさん03/07/16 02:15ID:???
$str =~ s/(^|<br>)((?:&gt;.*?(?:<br>|$))+)/$1<blockquote>$2<\/blockquote>/g;
068467803/07/16 17:05ID:???
>>683
ありがとうございます。完全に出来ました。
それに、マッチ変数も使っていないので一挙両得です。
本当にありがとうございます。
0685nobodyさん03/07/16 22:57ID:???
perl質問箱で質問したらココに行って来いって言われたので来ました

掲示板なんかで、引用符「>」「>」から先の文字の色を変えるにはどうしたらいいですか?
0686nobodyさん03/07/16 22:59ID:???
>>685
ちょっと前のレスをみりゃぁ分かる。

色程度ならCSSをつかえばいいしな
068767903/07/17 00:29ID:???
教えてもらえないでしょうか?
0688nobodyさん03/07/17 00:33ID:???
>>679,687

何がしたいのか意味不明。
068967903/07/17 01:28ID:???
すみません・・・CGIの抜き出しなんですけど、
$line =~ s/^(..)(...)//;を、PHPで使いたいんでどのように正規表現したら、
いいでしょうかということで・・・



0690nobodyさん03/07/17 02:06ID:???
>>689
CGI とか正規表現よりも、日本語の勉強したほうがいいぞ。
0691nobodyさん03/07/17 02:26ID:???
>>689
そのperlの文が何をしてるか分かってる?
perl互換の正規表現は preg_* で使えるから、PHPのマニュアルをよく読んでごらん。
0692nobodyさん03/07/17 09:54ID:???
夏厨&PHP厨らしい質問方法だな。質問内容も意味不明だがな(うひょげら
0693nobodyさん03/07/17 17:00ID:???
>>692
裳前の方が房っぽいがな
069467903/07/17 17:32ID:???
解決しました。^の意味解かってませんでした・・・
0695nobodyさん03/07/17 18:06ID:???
>>679を見て誰が何を答えることができるのだろう。本気で教えてもらおうとしてたんだろうか。
0696nobodyさん03/07/18 01:30ID:???
>>695
釣りでしょ。釣果は芳しくなかったようだが。
0697nobodyさん03/07/18 10:04ID:qmPObEGp
やりたいこと
 PHP4.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>
になりました。
069869703/07/18 10:04ID:qmPObEGp
--- Perlで書くと ---

#!/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:yTICzsYG
>>697-698
http://jp.php.net/manual/ja/pcre.pattern.syntax.php

6. Perlの\G言明は、一回のパターンマッチに関するものではないため、 サポートされません。
0700nobodyさん03/07/18 17:43ID:???
余裕で 700 GET ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
070169703/07/18 17:49ID:qmPObEGp
>>699
あれれ。そうなんですか。
PHPでどう書けばいいんだろう。
0702nobodyさん03/07/18 22:35ID:5012QaLa
>>701
$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:???
>>703
漏れのところでは動いているが。
$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:???
Perlで、

$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";
070770603/07/21 18:23ID:???
リスト対象だっけ?

foreach ( @a ) {
s/([a-z]+)/\1 /g;
tr/a-z/A-Z/;
}
0708nobodyさん03/07/21 18:36ID:???
なるほど。ありがとうございました。
0709nobodyさん03/07/21 20:27ID:???
>>705
=の前後はsplitで切れるし、置換でもいける

で、大文字の前にスペースを入れてぜんぶおおもじにすりゃぁいいのの?
071069703/07/22 10:45ID:FAepGeTT
>>702
すごい! 動きました。
ありがとうございます。
0711!70203/07/22 10:51ID:???
>>710 そりゃ動くだろ。回答者は質問者以上に慎重にレスしてるんだよ。(とつぶやきたい)
071269703/07/22 10:52ID:FAepGeTT
と思ったのですが
$word = "base bb<a href=\"http://hoge.hoge/bb/\">link Bb</a>bg big";
$word = preg_replace("/((?:^|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);

結果
<b>b</b>ase bb<a href="http://hoge.hoge/bb/">link <b>B</b>b</a><b>b</b>g big
になりました。

一部置換されないみたいです。。
0713nobodyさん03/07/22 10:57ID:???
>>711の立場は一体・・・
0714あぼーんNGNG
あぼーん
071570203/07/22 15:04ID:+ex6aWif
>>712
すまん。
$word = "base bb<a href=\"http://hoge.hoge/bb/\">link Bb</a>bg big";
$word = preg_replace('/(?:^|(?<=>))([^<]*)/e', "preg_replace('/(b)/i','<b>\\\\1</b>','\\1')", $word);
echo $word;

で多分OK.
http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside
を参考にした。

>>711
ワラタ.ゴメソ.
0716あぼーんNGNG
あぼーん
071769703/07/22 15:36ID:FAepGeTT
>>715
すごい!
ありがとうございます。
ちゃんと置換されてました!
0718nobodyさん03/07/24 18:38ID:9bbcZ2D/
http URL の正規表現についてですが、
Perlメモを見ると、長いバージョンと短いバージョンが以下のようにかかれてますが・・・

$http_URL_regex =
q{\b(?:https?|shttp)://(?:(?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f} .
q{][0-9A-Fa-f])*@)?(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.)} .
q{*[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.?|[0-9]+\.[0-9]+\.[0-9]+\.} .
q{[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f]} .
q{[0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-} .
q{Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f} .
q{])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*)} .
q{*)?(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])} .
q{*)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*} .
q{)?};

s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+

http:// or https:// がないパターンの正規表現っていうのは、
上記から、
長いバージョンは、(?:https?|shttp):// をとりのぞいたもの、
短いバージョンは、s?https?:// をとりのぞいたもの、
っていう認識は、あってますか?
0719nobodyさん03/07/24 18:47ID:???
>>718
そんなわけないだろう
0720あぼーんNGNG
あぼーん
072171803/07/24 23:48ID:???
>>719
あれ?
指摘きぼんぬ。

少なくとも短いバージョンはこれであってると思ったんだけど。。。
0722nobodyさん03/07/25 00:06ID:???
>>721
それでいいけど、そうすると、一般的すぎるんじゃないかね?
0723nobodyさん03/07/25 00:18ID:???
s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+ から s?https?:// を
取り除いて残るのは [-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+ だよな?

[ ] 内の文字が1文字以上ってことだ

1-1=2
(,,-_-)
(~*~)ohhoho(-_-;)
1000Get!!

いろいろマッチするけどいいのか?
まあ使う場所によってはいいのかもしれないが
0724nobodyさん03/07/25 00:59ID:???
>>722 >>723
そっとしといてやれよ・・・
0725nobodyさん03/07/25 01:15ID:???
http URL って、 scheme, hostname, pathname の3つに分ける事できるから、
その辺考えれば解ると思うが…
0726nobodyさん03/07/27 03:01ID:2mIqT5H5
すいません、初歩的な質問させてください。
linuxのコマンドライン上で、カレントディレクトリ以下からabcま
たはdefを含むファイル名を表示させたいのですが、
find|grep (abc|def)とかやってもだめなんです。どうすれば
よいんでしょうか?
0727nobodyさん03/07/27 04:08ID:???
>>726
find |egrep "(abc|def)"
0728nobodyさん03/07/27 09:47ID:???
>>725
port番号とユーザ名、パスワード、追加情報 が抜けてるぞ。

http://tokyo.cool.ne.jp/masapico/api_InternetCrackUrl.html
072972603/07/27 09:52ID:95lYaVNF
>>727
ありがとうございました!
0730あぼーんNGNG
あぼーん
0731nobodyさん03/07/27 11:38ID:???
>>728
それはそれぞれの項目に入るよ。rfc 読めば?
073273203/07/27 13:16ID:dJWoBMBZ
置換についてです。
$a内の『7月27日』を『7/27』に換えたいんですが、

$data =~ s/7月27日/7/27/g;

と、すると区切りのスラッシュがダブってしまいますよね。
こんなときの対処方法がご存知でしたら、
御教授お願い致します。
0733nobodyさん03/07/27 13:21ID:???
>>732
エスケープする。
0734nobodyさん03/07/27 13:51ID:???
/7月27日/{7/27}
0735nobodyさん03/07/27 13:56ID:???
>>728
リンク先、どう見ても素人のページだろ。お前マサピコか?
正確な情報を得るにはまともなページ見て勉強しろよ。
073673203/07/27 14:07ID:dJWoBMBZ
レスありがとうございます。
>>732
逆スラッシュ入れてもエラーになりました(T.T)

>>734
それは無理かと…
073773203/07/27 14:09ID:dJWoBMBZ
すいません。
>>732←>>733の間違いです
0738nobodyさん03/07/27 14:10ID:???
>>736
エスケープする。
$data =~ s/7月27日/7\/27/g;
073973203/07/27 15:07ID:dJWoBMBZ
>>738
$data =~ s/7月27日/7/\27/g;

[\]位置が逆でした(汗
ありがとうございます。
もう一つ御教授頂きたいのですが、

$data =~ s/ソ/そ/g;

こちらの置換がエラーとなってしまいます。
解決方法はございますか?
0740nobodyさん03/07/27 15:12ID:???
>>739
うるせーよ!
聞いてばかりいないで試すなりググるなりしやがれ!
0741nobodyさん03/07/27 15:47ID:???
ソとか表とか見飽きたな。
>>739
Shift-JIS分からないくせにわざわざShift-JIS使うな。
0742nobodyさん03/07/27 17:54ID:???
―(0x815C) ソ(0x835C) Ы(0x845C) �\(0x875C) 噂(0x895C) 浬(0x8A5C)
欺(0x8B5C) 圭(0x8C5C) 構(0x8D5C) 蚕(0x8E5C) 十(0x8F5C) 申(0x905C)
曾(0x915C) 箪(0x925C) 貼(0x935C) 能(0x945C) 表(0x955C) 暴(0x965C)
予(0x975C) 禄(0x985C) 兔(0x995C) 喀(0x9A5C) 媾(0x9B5C) 彌(0x9C5C)
拿(0x9D5C) 杤(0x9E5C) 歃(0x9F5C) 濬(0xE05C) 畚(0xE15C) 秉(0xE25C)
綵(0xE35C) 臀(0xE45C) 藹(0xE55C) 觸(0xE65C) 軆(0xE75C) 鐔(0xE85C)
饅(0xE95C) 鷭(0xEA5C) �x(0xED5C) �x(0xEE5C) �\(0xFA5C) �\(0xFB5C)
0743nobodyさん03/07/27 18:05ID:???
美乳テーブルも貼ってあげると、スレの親切度うp。
0744nobodyさん03/07/27 21:27ID:???
データ貼るより参考リンク貼ってあげた方が(ry
0745nobodyさん03/07/28 12:23ID:???
一瞬、曾という漢字がたらこくちびるで眼鏡かけてるつり目のおっさんに見えた
0746nobodyさん03/07/28 13:12ID:???
>>745
曾 よーく見ると絵に見えてくる文字 曾
http://life2.2ch.net/test/read.cgi/kankon/1052576557/
0747nobodyさん03/07/28 15:52ID:???
>>745
たった今、そう見えるようになった。
お前のせいで今後一生見え続けるだろう。どうしてくれる。
0748nobodyさん03/07/28 18:53ID:???
>>746
俺にはサザエさんの家に見える

曾 λλλλλλλλλλλλλ....ユカイダナ..
0749nobodyさん03/07/29 23:53ID:???
可変桁数の数値にマッチさせるような正規表現ってあります?
一桁〜二桁の数字をあぶり出したいのですが、[0-9][0-9]とかだと二桁数字しか見つけられないっす。
if(($_==[0-9])||($_==[0-9][0-9]))みたいな形にするしかないのかな…
0750nobodyさん03/07/30 00:06ID:???
>749
[0-9][0-9]?
[0-9]{1,2}
\d\d?
\d{1,2}
とか?
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
■ このスレッドは過去ログ倉庫に格納されています