正規表現道場@2ch Part2

このエントリーをはてなブックマークに追加
1nobodyさん
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

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

一度全部「プーヤン」に変換してから「プーヤン3号」から「3号」を取る、
という方法しかないんでしょうか?お願いします。
8nobodyさん:02/12/05 05:28 ID:???
>>7
こうかな。
$str =~ s/パーマン(?!3号)/プーヤン/g;
9nobodyさん:02/12/05 06:15 ID: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;
としてみたのですが無理でした。
説明不足ですいません。
10Name_Not_Found:02/12/05 06:32 ID:???
修正するときって普通元データを弄るんじゃないのかね?
11nobodyさん:02/12/05 07:02 ID:5X+JpwfG
そうです、元データをテキストエリアに読み込んでくるんです。
それを修正します。
12nobodyさん:02/12/05 07:44 ID:???
>>10
すいません、質問の意味がわかりました。
cgiで表示させるだけなら、その時にだけ自動リンクを使えばいいですよね、
でも一日ずつhtmlファイルで保存してそれを読み込んでくるタイプなので、
元ファイルにすでにアンカーが貼られてるんですよ。
だからそれを修正しなければならない、とこういうわけです。
掲示板というよりニュースサイトのようなものを作ってます。
1312:02/12/05 07:47 ID:???
間違った。

× アンカー
○ <a href=""></a>
14Name_Not_Found:02/12/05 08:16 ID: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 を参照。
1512:02/12/05 10:00 ID: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>の間にあるもの以外を全て置換しろ、という正規表現が書ければいいのですが
自分の力量ではとても、、、。
難しいです。
1612:02/12/05 10:05 ID:???
あれ?何か二日目に余計な&lt;/a&gt;っていうのがついちゃった。
17nobodyさん:02/12/05 10:20 ID:???
s/(?<![">])(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!["<])/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
18Name_Not_Found:02/12/05 10:45 ID:0NYAnUxi
>>15
それはもう処理の内容を考え直した方がいいと思われ。
基本的に追加なんだろうし。
html をこんな風にして、

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

簡単に言うと、
<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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

で。

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

$1 の方は、

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

でいいはず。

look-behind は

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

かな。こっちは Perl のバージョンが古いと使えない。5.6 あたりなら大丈夫。
9366:02/12/11 08:02 ID:???
>>92
lookbehindを使えば良かったんですね!
何度もありがとうございました。
94 :02/12/11 17:44 ID: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つ以上ある場合はどうしたらいいのでしょうか。
9594:02/12/11 17:49 ID:YVHUV6QH
$foo =~ s/(&gt;&gt;)([1-9][0-9]*)/<a href="#$2">$1$2<\/a>/g;
でございます。
96Name_Not_Found:02/12/11 18:06 ID: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;
9796:02/12/11 18:08 ID:???
ミスッた。
$value ってなんじゃ…
$1 ね。
9894:02/12/11 18:11 ID:YVHUV6QH
>>96 早速ありがとうございます。やってみます。
9994:02/12/11 18:49 ID:YVHUV6QH
なぜかうまくいきません。
恐れながら、$1は、>>にマッチするのではないですか?
すみません教えてください。
10096:02/12/11 20:29 ID: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;
10196:02/12/11 20:31 ID:7uJNDqfw
というか (?:...) を使う意味ないじゃんね…
意味無いんで外しといてください。
10294:02/12/12 00:14 ID:pDUwoT6Y
ありがとうございました。
103nobodyさん:02/12/24 22:43 ID:???
104名無しさん:03/01/03 00:29 ID:yu7P73hS
すいません 教えてください。。 
最短マッチが、いろいろ読んだけどわかりません。phpです。

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

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

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

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

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

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

このように書いてもソが脳内通りに取得出来ないんですが
どうすればいいんでしょうか?
112nobodyさん:03/01/03 21:33 ID:nupLg+Ov
$hoge=$1 if($text=~/((?:ソ)+)/);
113111:03/01/04 17:33 ID:???
>>112
無事成功しました。
ありがとうございました。
114山崎渉:03/01/15 13:36 ID:???
(^^)
115nobodyさん:03/01/18 13:42 ID:???
掲示板スクリプト作っているんですが、
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抽出部分はこんな感じです。
116nobodyさん:03/01/18 13:45 ID:hA2YqZMs
変な日本語ですみません。頭がボーとしてて・・・
117nobodyさん:03/01/18 15:29 ID:???
>>115
じゃあ、抽出後に<>を置き換える。
後、$1と$2、どうせ結合するならまとめて括弧でくくればいいのに。
118115:03/01/18 18:54 ID:???
>>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が続く場合等に予期しない結果になってしまいます。
119nobodyさん:03/01/18 19:01 ID:???
>>118
俺ならタグ付けは表示時に行う。データに妙な情報付けたくないんで。
120115:03/01/18 19:23 ID:hA2YqZMs
>>119
表示時にタグ付けすると解決する?
121nobodyさん:03/01/18 19:30 ID:???
>>120
そだろ。
122115:03/01/18 19:33 ID:???
でもデータは
&lt;a href=&quot;http://www.yahoo.co.jp/&quot;&gt;Yahoo&lt;/&gt;
とかになるわけで・・・
123nobodyさん:03/01/18 19:38 ID:???
>>122
なんでやねん。

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

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

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

今の場合は、単に正規表現を聞いてるんだから、/をエスケープする必要は無いし、
それに、Perlで使うときも、いちいち/をエスケープするのは、エレガントじゃない。
132nobodyさん:03/01/20 20:43 ID: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なんでしょうか?
そのへんの理屈がよく分かりません
133nobodyさん:03/01/20 21:52 ID:gSzazTge
構文解析時には、変数は展開されていない。
から、インタプリタはs/ / /を認識できる。
134nobodyさん:03/01/20 22:08 ID:???
>>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を展開部用のスタックに積み込んでいるのではなかろうか。

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

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

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

>>137
if等は使えないんですよ。
つまりエディタの検索、置換えに指定する事でgrepするようなものです。
139nobodyさん:03/01/22 12:22 ID:???
>>138
>つまりエディタの検索、置換えに指定する事でgrepするようなものです。

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

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

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

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

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

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

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

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

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

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

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

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

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

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



とかいって遊んでみる。


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

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


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

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


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

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

・・・なぜ!?
179質問者:03/02/02 18:20 ID:???
>>176-177
ありがと。
もしかして知らないところで世の中便利になってて
一撃で出来るかなーと思ったのですが。
とりあえずあきらめときます。
180177:03/02/02 18:57 ID:???
>>178
ム板だった。
素で間違えた(w
181nobodyさん:03/02/02 21:59 ID:???
>>180
いや、いいんでないの?w
182nobodyさん:03/02/14 01:16 ID:???
もげ
183nobodyさん:03/02/17 07:11 ID:tFA1sH7S
/hoge/piyo/foo\/bar/baka/
という文字列を split して
[ 'hoge', 'piyo', 'foo\/bar', baka ]
という配列を得たいのですが、/ で split するけど \/ では split しない
ってのはどう表せますか?
184nobodyさん:03/02/17 08:04 ID:???
[^\\]\/
185nobodyさん:03/02/17 10:03 ID:???
>>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ステートメントにするのもアリか。
186183:03/02/17 11:44 ID:???
ありがとうございました
187nobodyたん:03/02/18 01:11 ID:???
FYI
@hoge = split m[(?<!\\)/], $path;
188nobodyさん:03/02/18 18:45 ID:???
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>";

となってしまいます。この書き方で大丈夫だと思っていたのに、どうなってるんでしょうか・・・
189nobodyさん:03/02/18 18:57 ID:???
>>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;

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

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

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

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

ならtrueなのは自明だけど。
195192:03/02/19 00:13 ID:bka3cebn
>>193
ありがとうございます。やっぱし、正規表現よりは普通にプログラムで
やったほうが良いですか、、ちなにみJava使いです。んー、書いたことないので
なやみます。
196nobodyさん:03/02/19 00:49 ID:???
>>195
無視された・・・Java.util.regex使いなのに無視された。
197nobodyさん:03/02/19 00:59 ID:???
ビットマスクが8の倍数なら正規表現でも簡単だけど・・
198nobodyさん:03/02/19 01:00 ID:???
あぁ。サブネットマスクだった。
199nobodyさん:03/02/19 01:21 ID:???
正規表現雑技団とかでやりそうなネタだな。
200192:03/02/19 02:16 ID:bka3cebn
>>196
ええ、あれ、なんか、無視しちゃうような悪いことしちゃいましたか?
すいません、何かサンプル教えて下さるとうれしいす。。。
201nobodyさん:03/02/19 02:23 ID:???
これがスッキリとした正規表現で書けるっていうなら見物だな。
202nobodyさん:03/02/19 16:59 ID: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 = '\'\''

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

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

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

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

'' ' ' '' ' ' ' '

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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



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

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

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

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

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

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

>>271
「言語」はあるアルファベット(文字集合)からなるものの列をいうっていうようなことが
書いてあるので、たぶんここでは文字列っていうのと同じとみていいと思う。
「言語 受理」で検索するとそれっぽいページが多くヒットするので分野によっては
普通の表現なのかも(「受理」はまぁつまり「マッチが成功する」って言う意味)。
275nobodyさん:03/03/11 23:48 ID:???
あぁー分からないよぉ。。もちろんPerlの拡張正規表現は使わないんでしょ?
276nobodyさん:03/03/12 00:09 ID:???
>>275
あんたが何がわからないかわからないのだが
277nobodyさん:03/03/12 00:23 ID:???
>>275
使えばできる?
278nobodyさん:03/03/12 22:04 ID:hmpHRxfR
2ちゃんのスレッドのソースから名前だけ取り出す正規表現ってどうすればいいですか?
279nobodyさん:03/03/12 22:31 ID:wNWBQmqk
>>272
たぶんあなたのレベルの問題だと思うぞ。
あと2,3回我慢して読んでみなよ。
280nobodyさん:03/03/12 22:38 ID:???
.*

.+?
の違いって何ですか??
281あぼーん:あぼーん
あぼーん
282nobodyさん:03/03/13 02:18 ID:???
>>280
前者にヒットして後者にヒットしないものは空文字列くらいかな。
283nobodyさん:03/03/13 02:21 ID:???
>>282
後者にはなんでヒットしないの?
284nobodyさん:03/03/13 02:42 ID:???
>>283
そういうルールだから
285nobodyさん:03/03/13 15:28 ID:???
あれ、
(x?) って (|x) の略記法だと思ったんだけど。
だから空にもマッチするんじゃないの?
286nobodyさん:03/03/13 15:44 ID:???
>>285
その"?"と、>>280の"?"では意味が違います。
>>280の"?"は量指定子(この場合は"+")の後ろにありますので、
これは「最短のマッチを選べ」という指示になります。
結果として、".+?"は「何か一文字」にマッチするということになりますね。
287山崎渉:03/03/13 16:58 ID:???
(^^)
288nobodyさん:03/03/13 19:43 ID:???
>>286
なるほど、"+?" で一つのメタ記号なんですね。ゴミレススマソ
289nobodyさん:03/03/13 19:45 ID:???
>>288
違うぞ。
290nobodyさん:03/03/14 00:04 ID:???
291nobodyさん:03/03/14 00:04 ID:???
292nobodyさん:03/03/14 00:04 ID:???
293nobodyさん:03/03/14 00:05 ID:s293/lDl
293get
294nobodyさん:03/03/14 00:23 ID:???
{0,1}という意味での?と、
* +の後ろにくっつけた?は意味が違う。

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

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

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

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

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

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

なんらかの文字列が連続でn回以上続く

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

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

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

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

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

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

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

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

これじゃだめ?
328nobodyさん?:03/04/05 05:08 ID:???
>>327
配列コンテキストだとマッチした文字列の配列をを返すんですね。
なるほどサンクスです。
329Perl:03/04/05 10:25 ID:???
>>323の?は、半角の&です、、、
化けてしまった。
330Perl:03/04/05 10:26 ID:???
半角の&#だった、スマソ。? &#
331デフォルトの名無しさん:03/04/05 11:11 ID: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)をマッチさせたいのではないのかの。
それなら別の問い方がある。日本語をべんきょし直してこい
332nobodyさん:03/04/05 14:40 ID: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
というふうにしたいのですが
333nobodyさん:03/04/05 14:47 ID:???
$ perl -e '$_="\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n";s/\n[^\n]+\n$//;print'
334nobodyさん:03/04/05 16:15 ID:???
>>332
join('\n',(split(/\n/,"\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n"))[0..3])

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

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

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

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

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

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

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

で、自分ならこう書く。

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

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

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

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

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

超(?!クール)

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

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

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

です。
379nobodyさん:03/04/15 23:21 ID: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"

という出力が得られる。

さて,
380nobodyさん:03/04/15 23:22 ID: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;

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

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

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

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

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

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

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

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

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

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

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

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

ぐらいにしとかにゃだめなんじゃない
407nobodyさん:03/04/25 05:04 ID:???
408405:03/04/25 10:00 ID:EpsK+/d8
>>406
クスコです。試してみます。

>>407
情報源、クスコです。
Perlメモは読んでまして、そこのコメントタグも試しました。
ただ、あれでは意図しない部分まで削除してしまうケースがあるようです。
409123:03/04/25 10:36 ID: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);
410405:03/04/25 12:08 ID: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;

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

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

[^@]+@[a-zA-Z0-9\-_]\.[a-z]{,3}
416nobodyさん:03/04/26 19:14 ID:???
/^[^\@]+\@(?:[0-9a-z_-]+\.)+[a-z]{2,4}/i
417nobodyさん:03/04/26 19:26 ID:???
>>416
TLDは4文字以上も予定されているよ
418nobodyさん:03/04/26 19:28 ID:???
日本語ドメインはどうすんの?
419nobodyさん:03/04/26 20:02 ID:???
>日本語ドメイン
無かった事にしてくれ。
(でも、確かRFC的には許容内なんだよな。鬱)
420nobodyさん:03/04/26 21:59 ID:???
メールアドレスを正規表現でと言っても用途にもよるんだよな。
RFCに適合するかどうかのチェックなら厳密にやらなければならないし、
実際には許されない架空のアドレス風味を表すだけなら簡単だし。
421nobodyさん:03/04/27 01:10 ID:???
/\@/; #完璧!
422nobodyさん:03/05/07 01:48 ID: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\\].*?\\}//
423nobodyさん:03/05/07 02:05 ID:???
>>422
いいでつ。
424nobodyさん:03/05/07 03:09 ID:???
メールアドレスなら
@よりもあとを正引きしてMXレコードがあるかどうか
調べるとかどう?
425nobodyさん:03/05/07 03:11 ID:???
正引きする必要はないか
MXレコードがあるかどうかだけ調べてみるとか
DNS鯖とか落ちてたら登録拒否できるから
確認のメール送る場合とか結構有効じゃない?
426nobodyさん:03/05/07 07:37 ID:???
>>422
黙って移動してくんなバカ
427見習い中:03/05/07 09:46 ID:l7Gf5uMD
突然の質問で恐縮です・・・

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

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

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

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

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

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

とやったら、うまくいきました。(全角文字以外はエラーを返します。)
jcode.plの力ということでしょうか。。。プログラムは奥がふかいです。。。
431nobodyさん:03/05/09 22:56 ID:???
>>430
EUC-JPの力です。
432nobodyさん:03/05/10 18:06 ID:/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 $&;
}

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

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

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

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

<a name="" target="" href="http://hoge">
ってケースもある。
447435:03/05/11 11:05 ID:???
>>446
50点ってとこだな
448nobodyさん :03/05/11 12:33 ID:???
http_regx使っていいの〜?
449nobodyさん:03/05/11 14:25 ID:QXPmJshp
>>448
いいよ
450nobodyさん:03/05/11 15:26 ID:???
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;
451435:03/05/11 16:12 ID:???
>>450
<applet><a href="hoge">abc</a>
<address><a href="hoge">abc</a>
<area><a href="hoge">abc</a>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>505
typoに関係なくそのスクリプトは間違っている。
もう一回本読め。
507nobodyさん:03/05/19 23:42 ID:???
>>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";
----------------
508504:03/05/19 23:45 ID:???
>>507
資源の無駄だからもう書き込むな
スレが汚れる
509nobodyさん:03/05/19 23:48 ID:???
>>508
すいません。
>>504の正規表現でhttpd.confが拾えました。
あとはスクリプトの間違いを修正してみます。
510nobodyさん:03/05/19 23:52 ID:???
頭の固い香具師だな
511nobodyさん:03/05/20 00:17 ID:???
>>509
>>504の正規表現でhttpd.confが拾えました。
>>506の正規表現でも拾えてる。
512nobodyさん:03/05/20 00:33 ID:???
>>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;
----------------
513nobodyさん:03/05/20 00:38 ID:???
編集途中のソースが残っていたのでもう無視して下さい。
514nobodyさん:03/05/20 01:10 ID:???
フルパスで入力した場合は下のような値が入るので問題ないのですが
$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だけを抜け出せないでしょうか。
スレ汚しで申し訳ないです。
515nobodyさん:03/05/20 01:11 ID:???
#---------------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;
#--------------------------------------
516nobodyさん:03/05/20 09:12 ID:???
$path =~ /([^\\]\+)$/
print "$1";

っていうか use File::Basename; 使え。
517515:03/05/20 12:28 ID:???
>>516
ありがとうございます。
皆さんのおかげで完成しました。
use File::Basename; も調べてみます。
518515:03/05/20 12:30 ID:???
#---------------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";
#--------------------------------------
519515:03/05/20 12:33 ID:???
#---------------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";
#--------------------------------------
スレ汚しに付き合って頂いて感謝でした。
520nobodyさん:03/05/20 12:47 ID:ridin1oO
>>515

use File::Basename;
$path = 'C:\Program Files\Apache Group\Apache\conf\httpd.conf';
$file = basename($path);
print $file;
521あぼーん:あぼーん
あぼーん
522山崎渉:03/05/22 01:59 ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
523nobodyさん:03/05/25 03:32 ID:???
山崎のせいで落ちるところだったわ
524あぼーん:あぼーん
あぼーん
525山崎渉:03/05/28 17:06 ID:???
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
526nobodyさん:03/06/06 19:09 ID: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で返ってきます。。
?そのもにをマッチさせるにはどうすれば良いのでしょうか。

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

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

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

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

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

生徒: 3
..

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

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

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

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

生徒: 3
..
533nobodyさん:03/06/10 13:56 ID: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〜」
のように変換されてしまいます。

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

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

>>533
チョソなのでニポンコよくわからないてす。
ニポンコむつかしにだ。
535nobodyさん:03/06/10 23:58 ID:???
>531-532
ヘルプ開いて「タグ付き正規表現」というのを読めば幸せになれるかと
536nobodyさん:03/06/11 01:31 ID:???
>>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";
537nobodyさん:03/06/11 02:54 ID:???
あ、キーは長い順に sort しなきゃダメかな。まいっか。
538yoko:03/06/11 13:19 ID:FQ/QXZet
>>535
ありがとうできました!

チュパ (←フェラ)
539yoko:03/06/11 13:20 ID:???
>>534
チュパ♪
540nobodyさん:03/06/11 13:54 ID:???
>>537
チュパ(←カブラ)
541nobodyさん:03/06/11 14:04 ID:???
>>537
チュッパ(←チャップス)
542nobodyさん:03/06/11 16:25 ID: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ファイルがおかしく
なってしまっているのだと思われます。

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

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

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

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

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

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

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

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

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

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

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

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

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

print なにか

出力結果
XXX 111 XXX $ccc XXX

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

557nobodyさん:03/06/15 23:31 ID:???
>>556
正規表現というより、どっちかといえばperlのコーディングのほうがメインだな。
他でやってくれ。
558nobodyさん:03/06/15 23:32 ID:???
>>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);
559553:03/06/15 23:49 ID:/un8khu+
>>557
う・・・そうでしたか。。スマソです。
>>558
おぉおぉ〜どうもありがとうございます。
勉強になりました。
多謝!!
560nobodyさん:03/06/16 00:49 ID:???
>>558=バカ
561558:03/06/16 01:26 ID:???
>>560
漏れも自分でそう思った。
562nobodyさん:03/06/16 03:58 ID:???
なぜ?
563nobodyさん:03/06/16 05:58 ID:???
>>557だから。
564nobodyさん:03/06/16 07:28 ID:???
まぁ、いいじゃねぇか。たまには…。
マタ〜リしすぎだしこのスレ
565nobodyさん:03/06/19 09:48 ID:zhmAwMLg
すいません、ちょっと質問なんですが
今現在、<a name="1000</a>になってるソースを
<a name="1000">1000</a>に変更したいのですが
どうすればいいんでしょうか?

ちなみに「1000」の部分は「1」から「1000」までの連番で
<a name="1">1</a>
     から
<a name="1000">1000</a>
のようにしたいんです。
ヘンテコな説明ですみません。
566nobodyさん:03/06/19 10:26 ID:???
>>565
perlの場合はこんな感じかな。(変換前のHTMLが間違ってるけどそれでOKという前提で)

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

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

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

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

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

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

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

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

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

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

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

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

<a\s[^>]*?href="((https?|ftp):\/\/[-!\#\$%&'()*+,.\/:;=?\@~\w]+)"[^>]*?>([\s\S]+?)<\/a>
599597:03/06/22 04:51 ID:???
>>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>

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

preg_match_all ("/<\s*a\s[^>]*?href\s*=\s*(?:\"|\'|)([-!\#\$%&()*+,.\/:;=?\@~\w]+)(?:\"|\'|)[^>]*?>([\s\S]+?)<\/a>/i",
$contents, $out, PREG_SET_ORDER);
605nobodyさん:03/06/22 18:20 ID:???
>>604
「aをスペースで囲む」ってのに対応するのはナンセンスな気がするな。

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

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

<a alt="" href=""> はありえないことが確定してるの?
608nobodyさん:03/06/22 18:29 ID:???
<a>にaltはないが、titleとかclassなんかはありえるな。
609nobodyさん:03/06/22 20:57 ID:???
[<\s]+a [^>]*href[\s=]+(?:"([^"]+)"|'([^']+)'|([^\s>]+))[^>]*>(.+?)</a>
610nobodyさん:03/06/22 23:44 ID:???
<A
    name    =    "    anchor_id    "
    HREF    =    https://www.hogehoge.com/
    target    =    '    _blank    '
>
            ほ    <b>    げ    </b>    ほ    <i>    げ    </i>
</a

>
611nobodyさん:03/06/23 00:44 ID:???
以後、この手は放置で。
612nobodyさん:03/06/23 00:48 ID:???
駄目だこりゃぁ…

ここは別に最初から最後まで手取り足取り教える為のスレッドじゃないんだよ
>>598 で充分過ぎるほどヒント出てるんだから、自分で「正規表現」を
習得しつつコードを書こうという気は起きないのかい?
613597:03/06/23 02:57 ID:???
どうせ正規表現をつかって作るのなら柔軟なものを、と思っています。
今まで見てきたHTMLで「文法はおかしいけれどありそうなもの」
「このくらいならありえるかな」ってのを>>599にいくつかピックアップしてみました
ちょっとありえないものもあるかもしれません

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

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

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

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

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

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

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

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

ところで、パレートの法則って知ってる?
つーか、アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
629nobodyさん:03/06/23 20:43 ID:???
たのむからHTMLを真剣に勉強してくれ。
IE?いつまでバカブラウザをマンセーしているつもりだよ(つД`)
<a>はインライン要素。
http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/links.html#edef-A
630nobodyさん:03/06/23 22:32 ID:???
>>628
>アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
だけどこの質問者は「万能な」ものを求めてる。
HTMLがいくら間違ってても抽出したいと思ってるわけだ。
#その時点でオhルんだがな。
631nobodyさん:03/06/23 23:57 ID:???
おぃおぃ、もう夏厨の季節か?(藁
632nobodyさん:03/06/24 00:17 ID:VrEbx1+X

正規表現を使って、あるテキストの先頭から10行目を取得する書き方が、
解りません…どたか教えて下さい。どうか、お願いします。
JDK1.4.1の正規表現クラスを使ってます。
633nobodyさん:03/06/24 00:20 ID:VrEbx1+X
↑補足です。すいません、Jakarta-OROでもいいっす(Perl5ね)
634nobodyさん:03/06/24 00:58 ID:???
またくれくれか。もううんざり。
635nobodyさん:03/06/24 01:39 ID:???
splitで取得してやったぜ!

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




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





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




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





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

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

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

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

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

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

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

上のような正規表現で、括弧に入った文字列を全て@aに入れたいんですが、
実際にはループの最後の"i"と"505"だけしか入りません。
全てを@aに入れる方法はあるんでしょうか?
656nobodyさん:03/06/27 14:07 ID:???
>>655
@a = /((\w)(\d{3}|[ao]))+?/g;

@aの中身 w439 w 439 so s o z980 z 980 i505 i 505
657nobodyさん:03/06/27 23:00 ID:???
Perl5の正規表現で
$fn =~ s/\W/\0/g;
$fn =~ s/\0/\|/g;
は、一体どういう処理をしているのか判る方いませんでしょうか
658nobodyさん:03/06/27 23:17 ID:???
>>657
単語構成文字(_a-zA-Z0-9)以外の文字が | に置き換わる。
659655:03/06/28 00:06 ID:???
>>656
レスが遅れてすみません。
どうもありがとうございました。参考になりました。
660nobodyさん:03/06/28 04:40 ID:???
なんで
$fn =~ s/\W/\|/g;
じゃないんだろう
661nobodyさん:03/06/28 04:59 ID:???
\Wがなくて\0だけあったときでも置き換えられるように
662nobodyさん:03/06/28 05:20 ID:???
>>658
うーんなるほど。\|を変に難しく考えてました。
回答ありがとうございます。
663nobodyさん:03/06/28 08:45 ID:???
>>657
あ、ごめん。\0 って null 文字の事?
664nobodyさん:03/06/28 19:23 ID:???
\0=\000
665nobodyさん:03/06/29 09:15 ID:???
\0=\000=\x00
666nobodyさん:03/06/30 16:02 ID:???
>>661
\0って\Wに含まれないの?
667nobodyさん:03/06/30 16:44 ID:???
含まれないだろ。多分…
668nobodyさん:03/06/30 17:10 ID:???
>>667
多分じゃねーよ。ちゃんと調べろよ。

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

この桁数だと,

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

\\1\,\\2\\3

としたらできるんですが,もっときれいにできる方法を教えてください
673672:03/07/10 13:50 ID:qpJaCER1
× \\1\,\\2\\3
○ \\1\,\\2,\\3
674nobodyさん:03/07/10 14:00 ID:???
675nobodyさん:03/07/10 14:23 ID:???
>>674
Thx
つまり回すと言うことですね
676あぼーん:あぼーん
あぼーん
677山崎 渉:03/07/15 11:08 ID:???

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

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

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

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

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

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



690nobodyさん:03/07/17 02:06 ID:???
>>689
CGI とか正規表現よりも、日本語の勉強したほうがいいぞ。
691nobodyさん:03/07/17 02:26 ID:???
>>689
そのperlの文が何をしてるか分かってる?
perl互換の正規表現は preg_* で使えるから、PHPのマニュアルをよく読んでごらん。
692nobodyさん:03/07/17 09:54 ID:???
夏厨&PHP厨らしい質問方法だな。質問内容も意味不明だがな(うひょげら
693nobodyさん:03/07/17 17:00 ID:???
>>692
裳前の方が房っぽいがな
694679:03/07/17 17:32 ID:???
解決しました。^の意味解かってませんでした・・・
695nobodyさん:03/07/17 18:06 ID:???
>>679を見て誰が何を答えることができるのだろう。本気で教えてもらおうとしてたんだろうか。
696nobodyさん:03/07/18 01:30 ID:???
>>695
釣りでしょ。釣果は芳しくなかったようだが。
697nobodyさん:03/07/18 10:04 ID: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>
になりました。
698697:03/07/18 10:04 ID: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互換なのに、実行結果が異なるのでしょうか?
699nobodyさん:03/07/18 13:23 ID:yTICzsYG
>>697-698
http://jp.php.net/manual/ja/pcre.pattern.syntax.php

6. Perlの\G言明は、一回のパターンマッチに関するものではないため、 サポートされません。
700nobodyさん:03/07/18 17:43 ID:???
余裕で 700 GET ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
701697:03/07/18 17:49 ID:qmPObEGp
>>699
あれれ。そうなんですか。
PHPでどう書けばいいんだろう。
702nobodyさん:03/07/18 22:35 ID:5012QaLa
>>701
$word = preg_replace("/((?:^|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);
703703 ◆jhDfq/C6oU :03/07/21 06:22 ID:vOgKMI0a
置換についての質問なんですが、

$q1 =~ s/\b1\b/12番目/;
$q1 =~ s/\b2\b/16番目/;

[$q1]が[1]ならば『12番目』を、
[2]だったら『16番目』と置換えたいのですが、
[$q1]が[1]だった時、『12番目16番目』と置換えられてしまいます。

勘違いかもしれませんが、『\b』で境界をやってみても変わりません。

どのようにすると良いでしょうか?
ご教授お願い致します。。。

p.s 条件分岐のほうがいいのでしょうか?
704nobodyさん:03/07/21 09:20 ID:???
>>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
705nobodyさん:03/07/21 18:05 ID:???
Perlで、

$a[0] = "HyperTextTransferProtocol = HTTP";
$a[1] = "UniversalResourceLocation = URL";
$a[2] = "DataBase = DB";

これらの=より前の部分を大文字にしてスペースで区切って

HYPER TEXT TRANSFER PROTOCOL
UNIVERSAL RESOURCE LOCATION
DATA BASE

と出力させたい。
どなたかご教授願います。
706nobodyさん:03/07/21 18:21 ID:???
取り敢えず、こうヤルしかないかな…

$a[0] =~ s/([a-z]+)/\1 /g;
print $a[0] . "\n";

$a[0] =~ tr/a-z/A-Z/;
print $a[0] . "\n";
707706:03/07/21 18:23 ID:???
リスト対象だっけ?

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

で、大文字の前にスペースを入れてぜんぶおおもじにすりゃぁいいのの?
710697:03/07/22 10:45 ID:FAepGeTT
>>702
すごい! 動きました。
ありがとうございます。
711!702:03/07/22 10:51 ID:???
>>710 そりゃ動くだろ。回答者は質問者以上に慎重にレスしてるんだよ。(とつぶやきたい)
712697:03/07/22 10:52 ID: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
になりました。

一部置換されないみたいです。。
713nobodyさん:03/07/22 10:57 ID:???
>>711の立場は一体・・・
714あぼーん:あぼーん
あぼーん
715702:03/07/22 15:04 ID:+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
ワラタ.ゴメソ.
716あぼーん:あぼーん
あぼーん
717697:03/07/22 15:36 ID:FAepGeTT
>>715
すごい!
ありがとうございます。
ちゃんと置換されてました!
718nobodyさん:03/07/24 18:38 ID: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?:// をとりのぞいたもの、
っていう認識は、あってますか?
719nobodyさん:03/07/24 18:47 ID:???
>>718
そんなわけないだろう
720あぼーん:あぼーん
あぼーん
721718:03/07/24 23:48 ID:???
>>719
あれ?
指摘きぼんぬ。

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

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

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

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

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

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

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

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

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

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

こちらの置換がエラーとなってしまいます。
解決方法はございますか?
740nobodyさん:03/07/27 15:12 ID:???
>>739
うるせーよ!
聞いてばかりいないで試すなりググるなりしやがれ!
741nobodyさん:03/07/27 15:47 ID:???
ソとか表とか見飽きたな。
>>739
Shift-JIS分からないくせにわざわざShift-JIS使うな。
742nobodyさん:03/07/27 17:54 ID:???
―(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)
743nobodyさん:03/07/27 18:05 ID:???
美乳テーブルも貼ってあげると、スレの親切度うp。
744nobodyさん:03/07/27 21:27 ID:???
データ貼るより参考リンク貼ってあげた方が(ry
745nobodyさん:03/07/28 12:23 ID:???
一瞬、曾という漢字がたらこくちびるで眼鏡かけてるつり目のおっさんに見えた
746nobodyさん:03/07/28 13:12 ID:???
>>745
曾 よーく見ると絵に見えてくる文字 曾
http://life2.2ch.net/test/read.cgi/kankon/1052576557/
747nobodyさん:03/07/28 15:52 ID:???
>>745
たった今、そう見えるようになった。
お前のせいで今後一生見え続けるだろう。どうしてくれる。
748nobodyさん:03/07/28 18:53 ID:???
>>746
俺にはサザエさんの家に見える

曾 λλλλλλλλλλλλλ....ユカイダナ..
749nobodyさん:03/07/29 23:53 ID:???
可変桁数の数値にマッチさせるような正規表現ってあります?
一桁〜二桁の数字をあぶり出したいのですが、[0-9][0-9]とかだと二桁数字しか見つけられないっす。
if(($_==[0-9])||($_==[0-9][0-9]))みたいな形にするしかないのかな…
750nobodyさん:03/07/30 00:06 ID:???
>749
[0-9][0-9]?
[0-9]{1,2}
\d\d?
\d{1,2}
とか?
751nobodyさん:03/07/30 01:51 ID:???
>>750
できました…ありがとうございます。
{2}は00とか88とか同じ数字の連続にしかならないと勘違いしてたようです。
752nobodyさん:03/07/30 03:30 ID:???
>>751
それは
(\d)\1
だね
753nobodyさん:03/07/30 03:47 ID:???
>>751
漏れも始めのうちは勘違いしてたけど、* とか + とか {n,m} とかは、
「前の文字(列)」の繰り返しじゃなくて、「前の正規表現パターン」の繰り返しだからね。
754nobodyさん:03/07/30 07:23 ID:zn2EBRaL
$str= "<table>〜<table>〜</table>〜</table>〜"
に対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか?
$str =~ s/<table>(^(<table>))*?<\/table>//;
なんて文字列に対するキャレットみたいなのが有ればいいのですが。
$tmp = $str;
while($tmp =~ m|<table>(.*?)</table>|) {
755途中送信スマソ:03/07/30 07:26 ID:???
$str= "<table>〜<table>〜</table>〜</table>〜"
に対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか?
$str =~ s/<table>(^(<table>))*?<\/table>//;
なんて文字列に対するキャレットみたいなのが有ればいいのですが。
$tmp = $str;
while ($tmp =~ s/<table>(.*?<\/table>)/\1/) { }
$str =~ s/$1//;
とするしかないのかな?
756754-755:03/07/30 08:35 ID:???
すいません…>>14に答え有りましたね。
首吊って出直してきます…
757あぼーん:あぼーん
あぼーん
758nobodyさん:03/07/30 11:57 ID: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>

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

(?<=>)がいけないみたいなのですが、なぜでしょう?
761758:03/07/30 15:17 ID:xaoebVIF
JavaScriptでは拡張表現(?が使えない…?
762nobodyさん:03/07/30 15:48 ID:???
>>761
使えません。
763758:03/07/30 16:02 ID:xaoebVIF
>>762
あ、やっぱり。
(?<=を自分で作ってやらないといけないわけね。
764nobodyさん:03/07/30 16:06 ID:???
…作れるの?
765あぼーん:あぼーん
あぼーん
766758:03/07/30 16:21 ID:xaoebVIF
>>764
うーん --;
別の方法考えたほうが早いかな?
767あぼーん:あぼーん
あぼーん
768nobodyさん:03/07/31 02:36 ID:???
しかし>>758のパターン(Perl)だと
<a href="c0.html" title="capter0>prologue" target="_blank">
みたいなtagがあったら期待外れの置換をするんじゃないか?
769nobodyさん:03/07/31 03:34 ID:???
>>768
文句だけ言ってコードを示さないヘタレですか?
770nobodyさん:03/07/31 04:07 ID:???
>>769
アンタの目には文句に映るのか
ならいい 邪魔したな
771nobodyさん:03/07/31 09:42 ID:???
>>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);
}
772771:03/07/31 10:27 ID:???
$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);
}

の方が正確か。
773nobodyさん:03/07/31 10:47 ID:???
いい加減にウザイな。因みに script タグのところに javascript バージョン明示してもダメなのカナ?
javascript 嫌いだからどうでもいいが
774nobodyさん:03/07/31 10:58 ID:???
>>773
何に対して書いてるんだ?> javascript バージョン明示
775nobodyさん:03/07/31 11:31 ID:???
776nobodyさん:03/07/31 12:58 ID:???
もちょっとHTMLを勉強しろよな。
5年前の知識をそのまま使ってないか?
777nobodyさん:03/07/31 20:05 ID:???
778758:03/08/01 09:15 ID:9x/frkaP
>>771
JavaScriptでも出来るんだ。

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

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

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

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

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

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

じゃないの?(;´Д⊂
795nobodyさん:03/08/10 18:21 ID:???
がいしゅつって言われると思うけど
アンカーのアドレスと中身を抽出する正規表現教えて
796nobodyさん:03/08/10 19:17 ID:???
>>794-795
そんな質問>>2を読めって言われるだけだ。
まあ可哀想だから回答しといてやる。

>>2嫁。

・おまけ
[^(-->)]←こんな書き方できんぞ。
797nobodyさん:03/08/10 19:24 ID:???
(--;)
798nobodyさん:03/08/11 22:10 ID:???
( -Д-)
799nobodyさん:03/08/11 23:28 ID:DlYo/nU/
118.33-38(-0.78)
為替レートなのですが
こう言う表記がされていて

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

もう一つのパターンが1.1332-37(0.0025)
なのでつが
1.1332と1.1337と0.0025を抜き出したいのでつ。
お願いします。
800nobodyさん:03/08/11 23:32 ID:2ChtRC4J
23歳の割には幼い顔立ちをしている杏奈ちゃん。
制服姿もよく似合います。パイパン?と思われるほど陰毛が激薄なので
指姦、挿入シーンは注目してみてください!
フェラのテクニックなんかはやっぱり十代のそれとは比べ物になりませんね。
素人援交女の悶絶痴態 !
無料ムービー観てね
http://www.geisyagirl.com/
801nobodyさん:03/08/12 00:10 ID:???
>>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";
802nobodyさん:03/08/12 08:50 ID:3acz8emq
803(^o^)/...http://pleasant.e-city.tv/:03/08/12 21:11 ID:P8GdC1tU
804nobodyさん:03/08/13 03:36 ID:+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;
こうやるとしっかりとそのまま出るからです。

空回りしているのは承知ですが、どうか教えてください。
宜しくお願いいたします。
805nobodyさん:03/08/13 04:07 ID:???
>>806
正規表現の後半の部分が \:\s*?.+? だと最短マッチだから ": " にマッチするから、
"1.0" が残ったんでしょ。
806nobodyさん:03/08/13 04:18 ID:???
補足。こうすればどれがどこにマッチしたかわかりやすいかな。

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

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

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

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

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

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

/usr/local/apache/logs/access_log

このファイルだったら

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

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

の方が良いか。
822819:03/08/18 02:32 ID:???
>>820-821
たいへん参考になった
823nobodyさん:03/08/18 08:11 ID:???
スレ違いかもしれませんが。

.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 になってしまうのもよくわかりません。。
824823:03/08/18 08:12 ID:???
うわ、間違えた。
(*)じゃなくって、(.*)ですた。スマソ
825nobodyさん:03/08/18 13:30 ID:???
>>823
DirectoryIndex diary.cgi
という手もあるが、RFC2606 嫁とも云いたくなる(w
826nobodyさん:03/08/22 12:08 ID:???
初心者質問ですみません。

ある文字とある文字の間の文字だけ置き換えるのって、どうやるのでしょう?
例えば、「[1-9]お○こ[a-z]」を「[1-9]○んこ[a-z]」にしたい場合で、
[1-9]と[a-z]は変えない場合です。
827nobodyさん:03/08/22 12:45 ID:???
>>826
s/(?<=[1-9])お○こ(?=[a-z])/○んこ/g;
828nobodyさん:03/08/22 20:37 ID:???
おめこ
まんこ
829nobodyさん:03/08/23 00:47 ID:???
>>828
置換!
830nobodyさん:03/08/29 06:52 ID:W0Mz6JX/
>>826-829
( ゚д゚)ポカーン
831nobodyさん:03/09/02 03:30 ID:???
( ゚Д゚)ホシュ
832nobodyさん:03/09/02 17:32 ID:???
文頭から見た「-」から文末から見た「.」の間の文字列を出力するにはどうしたらよいんでしょうか?


1234567890-abcde.jpg → abcde
1234567890-ab.cde.jpg → ab.cde

abcdeの文字列、文字数は常に変化します。
833nobodyさん:03/09/02 18:05 ID:1YbtwYMS
長瀬愛ちゃんがセーラー服姿で大奮闘!小さな身体にルーズソックスがよく似合います。
お得意の騎上位での腰振りは必見です!!今すぐサンプルムービーで確認だ!

http://66.40.59.77/index.html
834nobodyさん:03/09/02 18:26 ID:???
>>832
.*?-(.*?).jpg$
ん?もしかしてこれも釣り?
835nobodyさん:03/09/02 20:36 ID:???
>>834
サンクス!!
836nobodyさん:03/09/03 10:08 ID:???
.*?-(.*).jpg$

が正解じゃね?
837nobodyさん:03/09/04 03:44 ID:???
WZ4.0の置換を使って

\n\n\n任意の一行



</dd>\n<dt>\n任意の一行\n</dt>\n<dd>

にしたいのだが『^.*$』では任意の一行にならない・・・
おそらくおれが正規表現歴2時間だから
きっとドキュソなんだろう
先生教えてください
おながいします
838837:03/09/04 04:21 ID:???
少し問い方が間違えたようだ

\n
\n
\n
任意の文字列\n



</dd>\n
<dt>\n
任意の文字列\n
</dt>\n
<dd>\n

にしたいが『.*』でならない・・・
だみだ〜
839nobodyさん:03/09/04 04:26 ID:???
>>838
たかだか2、3時間の試行錯誤でギブかい?
840837:03/09/04 05:43 ID:???
>>839
えっと、まだ頑張ってます(w

NEC版の世界大百科事典をJIS-X4081(EPWINGのサブセット)可しようと思ってね
DDwinで全文をテキスト抽出したのはいいのだが編集で挫けそうになってる
EBStudioで変換できるHTML形式にしないといけないのに
841nobodyさん:03/09/04 06:46 ID:???
全行を一つのスカラー変数に読み込んでから
$all_lines =~ s|\n\n\n([^\n]+)\n|</dd>\n<dt>\n$1\n</dt>\n<dd>\n|gs;
でどう?
842nobodyさん:03/09/04 07:04 ID:???
>>838
my $str = qq|


任意の文字列1



任意の文字列2
|;

print $str;
$str =~ s!\n{3}(.+)\n!</dd>\n<dt>\n$1\n</dt>\n<dd>\n!g;
print $str;
843nobodyさん:03/09/04 10:10 ID:???
国内からのアクセスだけを許可する目的で、IPアドレスから判断する文を
書いてみましたが、これでいけてます?

if (
 ($ip =~ /^133\.(\d+)\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^192\.(50|218|244)\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^202\.(1[135-]|2[3-6]|3[2-5]|48|2(0[89]|[1-5]\d))\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^203\.1(3[6-]|4[01])\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^210\.(1(2[89]|[3-6]\d|7[-5]|8[89]|9[016-9])|2(2[4-]|3\d|4[89]|5\d))\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^211\.([-9]|1\d|1(2\d|3[-5]))\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^218\.(4[-7]|110|2(1[6-]|2\d|3[01]))\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^219\.(9[6-]|1([01]\d|2[-7]|6[-7]))\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^220\.(9[6-]|1(0[4-]|1[01]|4[45])|2(0[89]|1\d|2[-3]))\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^221\.11[2-]\.(\d+)\.(\d+)$/) ||
 ($ip =~ /^61\.(1(1[2-]|2[-7]|9[2-])|2(0\d|1[-5]))\.(\d+)\.(\d+)$/)
) { …

参考:国内のIPアドレス範囲
ttp://www.nic.ad.jp/ja/dns/jp-addr-block.html
844nobodyさん:03/09/04 11:07 ID:???
漏れなら正規表現使わずビットパターン(ry
845837:03/09/04 13:10 ID:???
>>841
>>842
今から仕事なので後でtryしてみます
ありがとうです
846nobodyさん:03/09/04 20:37 ID:???
WZ4.0の正規表現は[]内に\nが使えないよ。
っともう関係ないか。
847nobodyさん:03/09/07 00:39 ID:???
ある文字列が、数字になってるかどうかって、正規表現一発で表せるもんでしょうか・・・?
ちなみにできればPerlで・・・
0
23
-23
2.3456
-2.3456
あたりはOKだけど、
0003とかはだめ。
3.0はOK
+4は(本当は数学的にはOKだけど)ダメ
てなかんじで・・
848nobodyさん:03/09/07 00:52 ID:???
>>2にあったような気がするが・・・
849nobodyさん:03/09/08 15:13 ID:???
>>847
まあまずはとりあえず自分で書いてここに晒してみな。
850nobodyさん:03/09/10 18:30 ID:???
PHPで
$str = "あ[B]いう[/B]え[I]おか[/I]き[B]くけ[/B]こ";
から
$str = "あ<b>いう</b>え<i>おか</i>き<b>くけ</b>こ";
という結果を得るにはどうすればいいですが?

preg_split('{\[B\](.+)\[/B\]}i', '<b>\\1</b>', $str);
preg_split('{\[B\]([^\[]+)\[/B\]}i', '<b>\\1</b>', $str);
としてもうまく行きません。
851nobodyさん:03/09/10 18:48 ID:???
追記ですが、
$str = "[B]いろは[I]にほ[/I]へと[/B]";
みたいに入れ子になったやつもうまくできるようにしたいのです。
852nobodyさん:03/09/10 22:23 ID:???
preg_replace( "{\[(/?[BI])\]}ie", "strtolower('<\\1>')", $str );

とか。この場合、文字コードが SJIS とかだとうまくいかないかも。
マルチバイト正規表現関数が使えるのなら、

mb_ereg_replace( "\[(/?[BI])\]", "strtolower('<\\1>')", $str, "ie" );

という感じでいけそう。
853nobodyさん:03/09/11 10:27 ID:zLbTeLZD
>>850
正規表現使わんでも
str_replaceで出来る。
$str=str_replace(array("[","]","B","I"),array("<",">","b","i"),$str);
とか
$str=str_replace(array("[B]","[/B]","[I]","[/I]"),array("<b>","</b>","<i>","</i>"),$str);
854nobodyさん:03/09/13 18:03 ID:???
最近ちょっとずつ正規表現が好きになってきたのですが、早くも挫折気味です。

FTPのNLSTで得られる文字列をTAB区切りするのはどうすればいいでしょうか?

例えば下記(半角スペースは省略されるため_に変更してあります)
-rw-r--r--___1_hogehoge___hogehoge________714_Sep_11_10:45_test.txt
のような場合はシンプルに
(PHPで)
ereg_replace ("_+", "\t", $filelist);
(viで)
:%s/_+/\t/g
でいけますが、もしファイル名にスペースが入った場合はいけません。
855nobodyさん:03/09/15 10:25 ID:???
BREGEXP使ってるんですが
英単語数えたいんですがどうすればよいかわかりません。
連続してマッチできないんです。

「m/.../g」で出来ないです。
856nobodyさん:03/09/15 11:25 ID:???
m/.../gs

複数行とか
857nobodyさん:03/09/15 15:51 ID:L3/wYHWQ
BREGEXP.DLLで、英単語抜き取ろうと思うと

[a-zA-Z'-]+\b

でいいんですか?
BREGEXP.DLLでは、「\b」は、単語の境界にマッチするらしいです
858nobodyさん:03/09/16 18:54 ID:???
質問なのですが、正規表現て[abc[^d]]みたいな事は出来ましたっけ?
Javascriptでブラケット内に指定していないはずの文字が引っかかってしまうので
個別に除外したいのです
859nobodyさん:03/09/16 18:55 ID:zwrMF0bN
sageたままになってました
860nobodyさん:03/09/16 19:52 ID:???
>>858
ふつーできない。
それより、その大元の問題になってる正規表現を晒して見る気はないかい?
861nobodyさん:03/09/16 19:55 ID:e1qNs9iA
perlを使った文章の置換で、特定の文字を含む行の削除をするとき
s/.*hoge.*\n//gi
とやっていて、これをhogeを含まない行の削除に変更しようとおもい
s/.*[^hoge].*\n//gi
とやってみたんですが、どうもうまく動きません。
どこが間違っているのでしょうか・・・?
862nobodyさん:03/09/16 20:01 ID:???
>>860
やはりか…
晒したいのですが根城がバレそうなので一応やめときます
863nobodyさん:03/09/16 20:32 ID:???
>>861
!
864nobodyさん:03/09/16 20:46 ID:???
>>861
split して grep して join するのが楽かも。敢えて解答は書かないので考えてみて。
865861:03/09/16 22:00 ID:e1qNs9iA
>>863,864
ううん。。。わからんです
s/.*(?!hoge).*\n//gi
にしてみたんだけど・・・だめぽい
もしかして、一行でやるのは無理なのかしら
866nobodyさん:03/09/16 23:26 ID:???
865はのび太
867nobodyさん:03/09/17 00:41 ID:???
>>865
気持ちはわかるけど、正規表現で全てを行うことに囚われすぎ。
while(<FILE>){
    next if /hoge/;
    print;
}
でいいじゃん。
868867:03/09/17 01:29 ID:???
間違った。ifじゃなくてunless。
869nobodyさん:03/09/17 05:47 ID:???
>>861
s/^(?:(?!hoge).)*\n//gim;
http://www.din.or.jp/~ohzaki/regex.htm
870nobodyさん:03/09/17 12:33 ID:???
>>865
ワロタw

>>867,868
できました。ありがとう!

>>869
それだとこんな↓変なエラーが出ました・・・なんでだろ
入力レコードが最大長を超えました。より大きい最大長を指定してください。
ちなみにcygwinのperlで動かしましたです。。。

正規表現じゃないんだけど友人にこんなやり方も教えて貰いました
cat xxx.txt | grep -v hoge

レスくれた人どうもでした。
871nobodyさん:03/09/21 22:20 ID:???
POSTやGET受け取ったデータたとえば
a=1&b=&c=&d=2&e=3
というようなデータのパラメータが空の部分だけ取り除いて
a=1&d=2&e=3
という形にして再びpostしたいのですが、一回の表現でなかなかうまく出来ません。
よい案ないでしょうか?
872nobodyさん:03/09/22 00:03 ID:???
>>871
で、お使いの処理系は?
873nobodyさん:03/09/22 08:48 ID:???
>>872
すいません大事なこと書き忘れてましたね・・perlです
874nobodyさん:03/09/22 09:00 ID:???
>>871 s/\w+=(&|$)//g
875nobodyさん:03/09/22 20:13 ID:???
perlについてです。
openしてファイルから読み込んだ

名前:$hash{name} 日付:$hash2{time}

という感じの文字列があります。
この文字列に含まれているハッシュを展開させるにはどのようにすればいいのでしょうか?

s/$(\w+?)\{(\w+?)\}/${$1}{$2}/eg;

とするのでは無理でした。
876nobodyさん:03/09/22 21:16 ID:???
&gt;&gt;875
どれが key になって、どれが value になるの?

どんな結果を期待しているのかも書いてくれないって(つД`)
最近難しい質問が多いよなぁ。。。
877nobodyさん:03/09/22 21:34 ID:???
>>875
Perlスレ向きの話題だが。
置換で解決するならシンボリックリファレンスを使う事になる。

no strict 'vars';
local %hash = (name => 'foo');
local %hash2 = (time => scalar localtime time);
my $str = '名前:$hash{name} 日付:$hash2{time}';

no strict 'refs';
$str =~ s/\$([A-Za-z_]\w+){([^}]+)}/${"$1"}{$2}/g;
print $str;

但し下記の方が楽は楽。

my %hash = (name => 'foo');
my %hash2 = (time => scalar localtime time);
my $str = '名前:$hash{name} 日付:$hash2{time}';
eval qq/\$str = "$str"/;
print $str;

いずれにせよ各変数の内容には充分注意しなければ
簡単にクラックされるので事前チェックを入念に。
878875:03/09/26 00:07 ID:???
>>877
ありがとうございます。
evalの使い道がやっとわかりました。でも確かに下手するとアブナイですね……。
879sage:03/09/29 21:57 ID:gvq1HDpk
どなたかご教授お願いします。

使用する正規表現エンジンはJRE32.DLL です。

論理演算(and or not)にて記入された文字列を正規表現に変換し
文字列の検索を行いたいのですが、
HOGE and FOO and BAR
のように、and検索を行う場合はどのような正規表現文字列に
変換すればよろしいでしょうか?
(*.HOGE.*)(.*FOO.*)(.*BAR.*)|(.*FOO.*)(.*HOGE.*)(.*BAR.*)| (以下略)
は避けたいと思っております。
880sage:03/09/29 22:00 ID:???
名前欄にsageと書いてしまいました。
失礼しました・・・。(恥
881nobodyさん:03/09/29 23:55 ID:???
>>879
strstr やら類似する関数をつかってその結果に対して
論理演算したほうがいいんじゃ?
882nobodyさん:03/09/30 04:40 ID:???
>>879
^(?=.*HOGE)(?=.*FOO)(?=.*BAR)
ただJRE32.DLLで動くかは分からない。
883nobodyさん:03/09/30 14:33 ID:???
>>882
http://www4.ocn.ne.jp/~kaerume/k2e/regex_4.html#e3

>>879
JRE32 だと
HOGE.*(FOO.*BAR|BAR.*FOO)|FOO.*(HOGE.*BAR|BAR.*HOGE)|BAR.*(FOO.*HOGE|HOGE.*FOO)
…が精々だと思う。
884nobodyさん:03/10/03 17:48 ID:iDWA2Ri2
始まりと終わりがAで、間が0-9にマッチさせたいのですが、どうしても分かりません。
マッチさせたいパターン → A123A AA A
/^A[0-9]*A$/だと Aにマッチさせられませんでした。
どうぞ、お知恵をお菓子下さい・・
885nobodyさん:03/10/03 17:59 ID:???
"A123A AA A" は「始まりと終わりがAで、間が0-9」に見えないのだが?
もうちょっとマッチさせたい条件をはっきりしる。
886nobodyさん:03/10/03 18:07 ID:???
こういうことかな?

/^A([0-9]*A$|$)/
887nobodyさん:03/10/03 18:11 ID:???
えとですね、始まりと終わりがAであれば
間には数字があっても無くても良いわけです。
Aも一応始まりと終わりがAなので、マッチさせたいのです。 
888nobodyさん:03/10/03 18:13 ID:???
グホッ
書き込んでいる間に、すみません。
>>886
そうです(TдT)/ 解決しました、本当に有難うございます。
889nobodyさん:03/10/03 18:17 ID:???
>>887
だから
>マッチさせたいパターン → A123A AA A
数字以外に空白とAがあるだろ?って。
890nobodyさん:03/10/03 18:24 ID:???
>>889
A123A or AA or A
と表したかったのです。紛らわしくてすみません(^^;
891879:03/10/03 21:33 ID:???
みなさん、色々ありがとうございました。
また奮闘してみます。
892nobodyさん:03/10/05 20:25 ID:N/gpdKcx
               _
              /  \―。
            (    /  \_
             /       /  ヽ   / ̄ ̄ ̄ ̄ ̄
         ...―/          _)  < /^ちんちんシュッ!シュッ!シュッ!$/
        ノ:::へ_ __    /      \_____
        |/-=o=-     \/_
       /::::::ヽ―ヽ -=o=-_(::::::::.ヽ
      |○/ 。  /:::::::::  (:::::::::::::)
      |::::人__人:::::○    ヽ/
      ヽ   __ \      /
       \  | .::::/.|       /
        \lヽ::::ノ丿      /
          しw/ノ___-イ
           ∪
893nobodyさん:03/10/05 21:48 ID:???
>>892
最後についてる変数は何なの?
894nobodyさん:03/10/05 22:09 ID:???
>>893
おいおい。末尾だろ
895nobodyさん:03/10/06 14:33 ID:???
PHPのereg_replaceつかってこんなことできますか?

$s='<HTML>省略省略<A HREF='http://なんちゃら'>あれ これ それ </A>'

$s='<HTML>省略省略<A HREF='http://なんちゃら'>あれ これ  それ </A>'

< > で囲まれていない部分のスペースを でおきかえたいんです
896nobodyさん:03/10/06 16:35 ID:???
>>895
もしかして、&nbsp;と言いたい?
897895:03/10/06 19:35 ID:???
>>896

そういいたかったんだけど、そう表示されていませんね。失敗しました。
リベンヂ。


$s='<HTML>省略省略<A HREF='http://なんちゃら'>あれ これ それ </A>'

$s='<HTML>省略省略<A HREF='http://なんちゃら'>あれ&nbsp;これ&nbsp;&nbsp;それ&nbsp;</A>'


< > で囲まれていない部分のスペースを &nbsp;でおきかえたいんです


どうでしょうか大丈夫かな。


898nobodyさん:03/10/06 19:47 ID:???
>>897
&nbsp;と表示させたいときには、
&amp;nbsp;と書けばいいよ。
899nobodyさん:03/10/06 20:23 ID:???
PHP 使った事ないから動くか分からんけど。

$s = ereg_replace ( "((?:\G|>)[^<]*?)\x20", "\\1 ", $s);

SEE ALSO: http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside
900nobodyさん:03/10/06 20:23 ID:???
阿呆だ俺…。
s/\\1 /&nbsp;/
901nobodyさん:03/10/06 21:54 ID:???
ん? s/\\1 /\\1&nbsp;/ でなくて?



ここで一句
正規スレ、みんなでハマるnbsp.(字あまり)
902nobodyさん:03/10/07 17:59 ID:???
つーか単純に

半角スペース" "は"&nbsp;"とかく。
"&"は"&amp;"とかく。

これを覚えておけば、
sub &hogehoge() とかを貼り付けた時にハマることもなくなるよ
903nobodyさん:03/10/07 18:33 ID:???
そういうの置換してくれる2chブラウザってないのかな。
904nobodyさん:03/10/15 01:16 ID:???
905nobodyさん:03/10/15 01:17 ID:???
906nobodyさん:03/10/15 01:18 ID:???

907nobodyさん:03/10/15 20:56 ID:???
Perlでの正規表現なんですが

 $pattern =~ s/(\w)(\d)/\1-\2/;

という置換の右の式を変数にしたいんです。

 $pattern =~ s/(\w)(\d)/$exchange/;

ところが

 $exchange = "\1-\2";
 $exchange = "\\1-\\2";
 $exchange = '\1-\2';

のどれもダメで、どうしたものか困ってます。誰かボスケテください。
908nobodyさん:03/10/15 21:17 ID:???
>>907
\1 better written as $1
\2 better written as $2
909907:03/10/15 22:04 ID:???
>908さんの言わんとする事が理解できてませんが、
なんか全然違う手段(修飾子e)で解決しました。
ありがとうございました。
910nobodyさん:03/10/18 01:54 ID:???
>>908 はPerlでは後方参照に \1 を使うより $1 を使ってくれ。といいたいらしい
911nobodyさん:03/10/18 12:58 ID:???
sjis文字,euc文字,jis文字を(文字クラス等で)表現できますか?
912nobodyさん:03/10/18 14:11 ID:???
913911:03/10/18 18:49 ID:???
>>912
d!
914nobodyさん:03/10/19 00:32 ID:???
>>913
どんだけ目を凝らして見ても>>2にリンク貼ってあるように見えるんだけど。
915nobodyさん:03/10/19 02:13 ID:???
>>914
>>2 を見てから質問する奴なんてほとんどいない罠。
916現調中:03/10/27 17:50 ID:???
質問です。何度やっても色々な所を調べても分かりませんでした。

Perlでの置き換えなのですが、
$test = '[tmp="http://www.yahoo.co.jp"] - [tmp="./test.gif"]';
を置き換えで・・
$test = 'http://www.yahoo.co.jp - ./test.gif'という風にしたいのです。

$test =~ s/\[tmp="(.*)"\]/$1/g; だと、うまく動いてくれません。
[tmp=""]ダブルクォート内の文字は固定されておらず自由に変わります。
宜しかったら教えて頂けないでしょうか?(;_;)
917nobodyさん:03/10/27 18:26 ID:???
>>916
.* の箇所が問題だね。「最長マッチ」「最短マッチ」で調べましょう。
918nobodyさん:03/10/27 18:33 ID:???
$test =~ s/\[tmp="([^"\]]*)"\]/$1/g;
919現調中:03/10/27 19:22 ID:???
>>918
うう(TT)本当に助かりました!
うまく動作しました。
現調が終わったらこれを元に自己学習に励んでみます。
感謝!
920nobodyさん:03/11/02 20:54 ID:???
正規表現覚えると、簡単な文字列比較にも使ってしまう。
負荷結構かかるんかな
921nobodyさん:03/11/02 21:45 ID:???
>>920
ケースバイケース。
922nobodyさん:03/11/06 21:51 ID:QQMTRNI6
perlで右辺から左辺へマッチするようにはできないの?
923nobodyさん:03/11/06 22:19 ID:???
いったい何を言ってんでしょ。。。
924nobodyさん:03/11/06 22:28 ID:???
Ruby みたいにできないか?ってこと?

foo =~ /bar/
/bar/ =~ foo
925922:03/11/06 23:32 ID:???
>>923
ごめんなし日本語うまくないんです。

>>924
Rubyは使ったことないのでよく分からないんですが
例えが
$name="abc";
$name=~ /\w/
だとa→b→cってマッチしちきますよね。それを逆に
c→b→aというふうにできないのでしょうか?
926nobodyさん:03/11/07 00:08 ID:???
>>925
$_ = 'abcdef';

print /^(\w{3})/; # abc
print /(\w{3})$/; # def

print join '/', /(\w)/g; # a/b/c/d/e/f
$_ = reverse $_;
print join '/', /(\w)/g; # f/e/d/c/b/a
927922:03/11/07 00:29 ID:???
>>926
ありがとうございます。
やつぱり、文字反転させないとだめなようですね。

ほんとううにありがとう、ございますだ。
928nobodyさん:03/11/07 03:01 ID:???
アラビア語の正規表現だと右からマッチする・・・わけないか?
929nobodyさん:03/11/07 05:16 ID:???
そういう意味だったのか。右辺左辺とは違うだろうが。
930nobodyさん:03/11/07 13:53 ID:???
質問です。

<table>...</table>


<table>...</table>

<table>...</table>



<table>...</table>

のように、テーブルの閉じタグと開始タグの行間がバラバラなので、
3行に統一したいのですが、どう書けばよいのでしょうか?
931nobodyさん:03/11/07 14:16 ID:???
</table>の後ろでENTERキーを4回押すよう努める。
932nobodyさん:03/11/07 14:22 ID:???
>>930
実装言語は Perl ? $html に HTML 全体が入ってるとして、
$html =~ s/(<\/table>)\s*(<table)/\1\n\n\n\2/ig;
933930:03/11/07 14:28 ID:???
>>931
解決しました。ありがとうございました。
934nobodyさん:03/11/10 16:07 ID:???
>>933
931で解決なのかよ!
935932:03/11/10 17:40 ID:???
(⊃д`)
936nobodyさん:03/11/11 10:46 ID:???
(⊃д`)ヽ(゚Д゚ )ヨシヨシ
937nobodyさん:03/11/11 11:28 ID:???
ネタで解決ってのも珍しいな
938nobodyさん:03/11/12 06:23 ID:VJcp1gvZ
質問です。

例えば、以下のようなデーターが別ファイルになっていた時、

$ab_cd = '12ab' ; # aaaaaa
$efg_h = 'あいう'; # ccccc

これを、
$in[0] = abc_cd
$in[1] = efg_h
$aa[0] = 12ab
$aa[1] = あいう
のように取り出す方法と、値を変えてもとの位置に置き換える方法の二つをお願いします。
939nobodyさん:03/11/12 10:26 ID:???
>>938
それは正規表現で解決できる問題じゃないと思う。
940nobodyさん:03/11/12 14:39 ID:VJcp1gvZ
いや、だから、正規表現の部分で教えてほしい事柄とは検索と置換なんです
前にですね、
@buffer = <IN>;
foreach $line (@buffer) {
if( $line =~ /(この部分が不明)/)[
$in[0] = $1; $aa[0] = $2;
}
}
といったようなものを見かけましたので、「(この部分が不明)}として示した部分を教えてもらえば何とかなると思ったのです。
941nobodyさん:03/11/12 14:41 ID:???
いや、だから、
いや、だから、
いや、だから、
いや、だから、
942nobodyさん:03/11/12 14:45 ID:???
>>940
かなり適当。
/^\$(\w+)\s*=\s*([\'\"])([^\'\"]+)\2/
943nobodyさん:03/11/12 19:02 ID:???
>>940
じゃあ最初からそれを書(ry
情報の小出しはよくない。
944nobodyさん:03/11/12 20:13 ID:VJcp1gvZ
>>942
うまくできました。ありがとうございました。
945nobodyさん:03/11/12 21:54 ID:VJcp1gvZ
忘れていましたので、再び質問です。

@wday = ('日','月','火','水','木','金','土') ;

といった感じのものを、「wday」と「'日','月','火','水','木','金','土'」として取り出す正規表現を教えてください。
946nobodyさん:03/11/12 21:58 ID:???
>>945
まずは自分でどこまで考えたか示せよ。
947nobodyさん:03/11/12 22:06 ID:???
前のもそうだけど「wday」を得たいとか言うのからしておかしいよな
根本的なコードの書き方に疑問が
948nobodyさん:03/11/12 22:30 ID:VJcp1gvZ
>>947
「wday」は例で、
@abc = ('aa','bb','cc'); #aaaaaa
の場合の、「abc」と「'aa','bb','cc'」でも良いのです。
$in = $1; $dd{$in} = $2; として取り出したいだけなので。
949nobodyさん:03/11/12 22:46 ID:???
いや、だから、それがおかしいと言ってるのだが
ま、好きにすればいいや
950nobodyさん:03/11/12 23:07 ID:???
>>949
漏れはその気持ちはわからないでもないよ。
たとえば、そういう糞コード書き散らした香具師がいて、
ハードコードしてたデータをハッシュテーブルに直す修正を一括して行いたい、とか。

>>948
例によってかなり適当。
/^\@(\w+)\s*\=\s*\(([^\)]*)\)/
951nobodyさん:03/11/12 23:54 ID:VJcp1gvZ
>>950
ありがとうございました。うまくいきました。
952nobodyさん:03/11/13 09:30 ID:???
>>950 この程度のことを自力で解決できない香具師はまた糞コードを書き散らすと思われ
953nobodyさん:03/11/13 09:40 ID:???
俺は、糞コードを撒き散らしながら今日まで成長してきた。
954nobodyさん:03/11/13 09:57 ID:???
俺は、糞を撒き散らしながら(ry
955nobodyさん:03/11/13 10:29 ID:???
俺は、糞を巻きなが(ry
956nobodyさん:03/11/13 11:33 ID:???
俺は、糞
957nobodyさん:03/11/13 23:30 ID:???
bokuso
958nobodyさん:03/11/13 23:37 ID:???
僕掃除当番
959nobodyさん:03/11/14 22:03 ID:???
姉妹スレ
最近うんこ喰ってる?
http://okazu.bbspink.com/test/read.cgi/ascii/1062511008/
960nobodyさん:03/11/15 02:12 ID:???
PHPでの正規表現について質問です。


if (ereg("<(.*@docomo\.ne\.jp)>",$str,$match)) { // i
}elseif (ereg("<(.*@ezweb\.ne\.jp)>" ,$str,$match)) { // ez
}elseif (ereg("<(.*@[dhtckrnsq]\.vodafone\.ne\.jp)>", $str ,$match)){ // v
}elseif (ereg("<(.*@jp-[dhtckrnsq]\.ne\.jp)>" , $str ,$match)){ // j
}else{
}
return $match[1];


というような動きの関数を作りました。
$strには複数の< > 付きメールアドレスがあります。
その文字列の一番最初に見つけた<>付きメールアドレスから
<>をとった純粋なメールアドレスを取得したいと思っております。
今のままですと、メールの後のほうにある>に反応してしまいます。

どうぞお知恵をお貸しくださいっっ。
961nobodyさん:03/11/15 12:09 ID:???
PHPのことは全くもって知らないんだけど
(.*@docomo\.ne\.jp)

([^>]+?@docomo\.ne\.jp)

こういうのってPHPじゃ使えないの?
962nobodyさん:03/11/15 12:34 ID:???
>>961
[^>]+なら最短マッチにしなくても最初の>で止まるし。
つかRFC2822的には@の前に>来てもOKだし。
0文字のユーザ名を許可しないなら.+?でいいのでは。

>>960
私もPHP知らんけどeregでは最短マッチ使えなくて
preg_matchを使えって事らしい。ググって。
963nobodyさん:03/11/15 14:09 ID:???
RFC的な話は別にして、メールアカウントとして普通に認められる文字って
英数と - _ ぐらいだと思う(Yahoo mailでは - も使えなかった)ので
[-\w]+?@docomo\.ne\.jp で充分なんじゃない?
後ろに @ があるので最短マッチにせず
[-\w]+@docomo\.ne\.jp でも同じだと思うけど。
余計なものはなるべく認めないという方向で。
964nobodyさん:03/11/15 15:16 ID:???
>>963
せめて先頭はアルファベットくらいは判別した方が。
965nobodyさん:03/11/15 15:33 ID:???
docomoのメルアドって今でも電番だけのやつって通用するのかな?
だとすると先頭をアルファベットに限定するのはマズイかも
0で始まるのだけ含むってのはアリかもしれないけど
966nobodyさん:03/11/15 17:19 ID:???
(´-`).。oO(なんで RFC を無視しちゃうんだろうねぇ。。。)
967nobodyさん:03/11/15 17:23 ID:???
>>963
スレ違いな話になるけど、DoCoMo は . も使える事が名言されている。
http://www.docomo-kansai.co.jp/i-mode/qa/guestion_04.html
そして RFC 的には不正な、@ 直前に . が来るメールアドレスも実際に
使われている。旧 J-Phone は更に / ? + が使えるらしい。

こういったケースにぶつかる度に変更を加えていくのは泥沼なので、
最初から「\w と - のみ」のようにキツめのハウスルールを課すよりは
寛容なルールを採った方が、運用時に問題が出にくい。
968nobodyさん:03/11/15 17:26 ID:???
>RFC 的には不正な、@ 直前に . が来るメールアドレス
いったいどのRFCに使えないなんていう記述が?
969nobodyさん:03/11/15 17:36 ID:???
PerlメモのURL文字列を判別するやつのように
RFC完全準拠となると実用に耐えない正規表現になることもあるので
ほどほどにってことで。特にRFC崇拝者は。
970nobodyさん:03/11/15 18:05 ID:???
>>968
RFC 2822 より

addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part

dot-atom = [CFWS] dot-atom-text [CFWS]
dot-atom-text = 1*atext *("." 1*atext) ; 注目

obs-local-part = word *("." word) ; 注目
word = atom / quoted-string
atom = [CFWS] 1*atext [CFWS]

atext = ALPHA / DIGIT /
    "!" / "#" / "$" / "%" / "&" / "'" /
    "*" / "+" / "-" / "/" / "=" / "?" /
    "^" / "_" / "`" / "{" / "|" / "}" / "~"

よって local-part の途中に . が来るのは OK ([email protected])
だが、末尾 (@ の直前) に来るのは NG ([email protected]) 。
971nobodyさん:03/11/15 22:08 ID:???
>>969
お前が RFC を読めないからって滅茶苦茶言うなよ。
972nobodyさん:03/11/16 11:50 ID:???
>>969は、保守性と処理速度を鑑みて「実用に耐えない」だと思う。
973nobodyさん:03/11/16 12:34 ID:???
>>972
ということにしたいのですね? :-)
974nobodyさん:03/11/16 14:15 ID:???
速度も保守性もそれほど違わんと思うが...。
単に分かったとこだけで済ましとこうというのが
本音のような気もする。
(?:(?:[a-z]|[A-Z])(?:(?:[a-z]|[A-Z])|[0-9]|[-+.])*:(?:(?://(?:(?:(
?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])
(?:[0-9]|[A-Fa-f])|[;:&=+$,])*@)?(?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9]
)|(?:(?:[a-z]|[A-Z])|[0-9])(?:(?:(?:[a-z]|[A-Z])|[0-9])|-)*(?:(?:[
a-z]|[A-Z])|[0-9]))\.)*(?:(?:[a-z]|[A-Z])|(?:[a-z]|[A-Z])(?:(?:(?:
[a-z]|[A-Z])|[0-9])|-)*(?:(?:[a-z]|[A-Z])|[0-9]))\.?|[0-9]+\.[0-9]
+\.[0-9]+\.[0-9]+)(?::[0-9]*)?)?|(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[
-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[$,;:@&=+])+)(?:
/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(
?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[
-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*(?:
/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(
?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[
-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*)*)
?|/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f]
)(?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])
|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*(
?:/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f]
)(?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])
|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*)
*)(?:\?(?:[;/?:@&=+$,]|(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%
(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]))*)?|(?:(?:(?:(?:[a-z]|[A-Z])|
[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[;?:@&=+
$,])(?:[;/?:@&=+$,]|(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:
[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]))*)|(?://(?:(?:(?:(?:(?:(?:(?:[a-
z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]
)|[;:&=+$,])*@)?(?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|(?:(?:[a-z]|[A-
Z])|[0-9])(?:(?:(?:[a-z]|[A-Z])|[0-9])|-)*(?:(?:[a-z]|[A-Z])|[0-9]
以下省(ry
976nobodyさん:03/11/16 19:12 ID:???
おしい。
ちょい工夫するともっと分かりやすく正確な表現になる。

って大昔からくりかえし話題になるネタだけど。
実際上はそこまでしないで逃げる罠。
977nobodyさん:03/11/16 21:24 ID:???
>>960 の目的はメールアドレスが RFC 的に valid かを調べる事じゃ
ないし、domain は固定なので、厳密に調べるにしても必要なのは
local-part の正規表現だけだ。

my $atext = qr"[!#\$%&'*+\-/0-9=?A-Z^_`a-z{|}~]";
my $qtext = qr/[^\x0A\x0D"\\\x80-\xFF]*/;
my $valid_local_part = qr/
  (?:$atext+(?!$atext)|"$qtext(?:\\[^\x80-\xFF]$qtext)*")
  (?:\.$atext+(?!$atext)|"$qtext(?:\\[^\x80-\xFF]$qtext)*")*
/x;

. の使い方に目くじらを立てなければこうできる。

my $loose_local_part = qr{
  (?:
    [!#\$%&'*+\-./0-9=?A-Z^_`a-z{|}~]+
  |  "$qtext(?:\\[^\x80-\xFF]$qtext)*"
  )+
}x;

これで foo.bar.@domain も "(>_<)\ {@o@}"@domain も通る。
978nobodyさん:03/11/18 02:53 ID:???
クエリのチェックをしようとしているのですが、どうすれば良いのでしょうか。
形式は「一つの組は英数字=英数字、複数ある場合は&区切り」という一般的なもので、
ここでのチェックは単にその形式に沿っているかどうかを判断するだけとしたいと思い

m/^(((\w*?)?=?(\w*?)?)?(\&?))+$/

とやってみたのですが、「=」が二つ続いていたら通ってしまうなど駄目なようで、
この辺りで詰まって解らなくなり質問に来た次第です。
979nobodyさん:03/11/18 04:02 ID:???
>>978
英数字は空文字を許さない、とかなら、こんなんでいいのでは?
「英数字=英数字」、複数ある場合はこの後にさらに「&英数字=英数字」を繰り返し。
m/^\w+\=\w+(?:\&\w+\=\w+)*$/
980nobodyさん:03/11/18 04:14 ID:???
「英数字=なし」もあるよね
これでうまくできた気がするけど

\w+?=\w*?(&\w+?=\w*?)*
981nobodyさん
>>973-974
じっくり読んでみてやっと理解できました…どうもです。