2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

正規表現道場@2ch Part2

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

リンクなどは>>2-5のあたりに。

2 :nobodyさん: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


3 :nobodyさん:02/11/24 23:00 ID:???
前スレ
正規表現道場@2ch
http://pc.2ch.net/test/read.cgi/php/996105815/


4 :nobodyさん:02/11/25 00:15 ID:oyWFxt5H
パターン集みたいなのは無いですか?
コード書く度に思い出すはめんどい。ていうか忘れてる。

5 :nobodyさん:02/11/26 00:40 ID:0Bd71gu9
http://www.lilac-love.com/venus/default.asp?agid=87381

6 :Name_Not_Found:02/11/29 22:13 ID:/ULd/3Z0
age

7 :nobodyさん:02/12/05 05:07 ID:5X+JpwfG
perlのcgiですけど、正規表現の置換でこれを含む語は置換したくないっていう時は
どうやるんでしょうか?
例えばテキスト中の「パーマン」は全部「プーヤン」に置換したいんだけど、
「パーマン3号」だけはスルーする、という風にするには。

一度全部「プーヤン」に変換してから「プーヤン3号」から「3号」を取る、
という方法しかないんでしょうか?お願いします。


8 :nobodyさん:02/12/05 05:28 ID:???
>>7
こうかな。
$str =~ s/パーマン(?!3号)/プーヤン/g;

9 :nobodyさん: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;
としてみたのですが無理でした。
説明不足ですいません。

10 :Name_Not_Found:02/12/05 06:32 ID:???
修正するときって普通元データを弄るんじゃないのかね?


11 :nobodyさん:02/12/05 07:02 ID:5X+JpwfG
そうです、元データをテキストエリアに読み込んでくるんです。
それを修正します。

12 :nobodyさん:02/12/05 07:44 ID:???
>>10
すいません、質問の意味がわかりました。
cgiで表示させるだけなら、その時にだけ自動リンクを使えばいいですよね、
でも一日ずつhtmlファイルで保存してそれを読み込んでくるタイプなので、
元ファイルにすでにアンカーが貼られてるんですよ。
だからそれを修正しなければならない、とこういうわけです。
掲示板というよりニュースサイトのようなものを作ってます。

13 :12:02/12/05 07:47 ID:???
間違った。

× アンカー
○ <a href=""></a>

14 :Name_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 を参照。

15 :12: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>の間にあるもの以外を全て置換しろ、という正規表現が書ければいいのですが
自分の力量ではとても、、、。
難しいです。

16 :12:02/12/05 10:05 ID:???
あれ?何か二日目に余計な&lt;/a&gt;っていうのがついちゃった。

17 :nobodyさん:02/12/05 10:20 ID:???
s/(?<![">])(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!["<])/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;

18 :Name_Not_Found:02/12/05 10:45 ID:0NYAnUxi
>>15
それはもう処理の内容を考え直した方がいいと思われ。
基本的に追加なんだろうし。
html をこんな風にして、

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

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

過去記事も頻繁に修正する可能性があるなら元データを残すやり方にするべき。
もっとも、リクエスト毎に html に変換するんではなく、
スタティックな html をあらかじめ作っておくってやり方はそのままでいいと思う。

19 :Name_Not_Found:02/12/05 10:48 ID:???
実際、複雑すぎる正規表現は速度とメンテナンス性を低下させるし。



20 :nobodyさん:02/12/05 17:44 ID:???
>17
それじゃ<br>が入ってる場合は最初の行しか置換されないし、
その最初の行も最後の一文字が無視される罠。

21 :12:02/12/05 19:13 ID:5X+JpwfG
すいません、遅れました。
今17さんのでやってみたのですが、確かに20さんがおっしゃるような結果が出てしまいました。
あと、メールアドレスが置換されないみたいです。

>15
まさにそのやり方です、<!-- news here -->のようなコメントをサーチする。
ただ、僕は修正がすごく多いです、、、。
元データを残すやり方は、人様のスクリプトを改良してるので
一からやり直しになるし、またバージョンアップ版が出た時の互換性とか考えると
ツライですねぇ。
もちろん、著作権表示と改造表示は出してます。

22 :12:02/12/05 19:37 ID:???
失礼、>15ではなくて>18でした

23 :nobodyさん:02/12/06 00:05 ID:0LEQc9+/
>>12
とりあえず10分ほどやってみたが出来なかった、
ウチの上司なら出来ると思うが昨日から出張‥‥

24 :nobodyさん:02/12/06 00:14 ID:???
未だに意味がわからねぇw

一旦アンカータグ消せばいいんジャネーノ?的外れ?

25 :nobodyさん: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>

みたいのも混ざってるってことでしょ。

26 :nobodyさん:02/12/06 00:42 ID:???
2chだせぇ

27 :Name_Not_Found:02/12/06 03:26 ID:N6C9SdnH
じゃあ、こうするのは?
追加と修正は別フェイズにするの。

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

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

なんだか正規表現と関係なくなってきたなぁ…

28 :nobodyさん:02/12/06 05:06 ID:???
すいません、もともと正規表現についてはよくわからなかったので、とりあえず
「変数$newsの中から、アンカータグの中のものと、アンカータグに囲まれた部分は
無視してそれ以外を置換する」
ということがサクっと簡単に出来るものだと思ってました。
長く引っ張ってしまって申し訳ないです、正規表現、一から出直して勉強してきます。

29 :nobodyさん: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;


30 :Name_Not_Found:02/12/06 14:31 ID:???
>>29
そういう処理しなきゃいけない状況が不毛なんだってば。

31 :nobodyさん:02/12/06 16:16 ID:???
>>21
全部一から自分で作ればいいじゃん。

32 :nobodyさん:02/12/06 16:19 ID:???
>>30
質問に答えて何か問題があるのか?

33 :Name_Not_Found:02/12/07 04:46 ID:705rdiGC
>>32
おばかなプログラムが増えていく状況を助長してはいけません。
「ライトついてますか?」でも読んでくれ。

34 :nobodyさん:02/12/07 07:33 ID:???
>>33 あっそ。死ねよ。

35 :Name_Not_Found:02/12/07 11:04 ID:???
>>34 幼いね。

36 :nobodyさん:02/12/08 12:52 ID:???
オリジナルタグみたいなモノを使えるようにしているのですが

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

どうしたら良いでしょうか?

37 :nobodyさん:02/12/08 12:59 ID:???
>>36
オリジナルタグってなに?

無効にするってどうすることを無効とするの?

38 :36: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;

ソースはこんな感じです。どうしたらいいでしょう…

39 :nobodyさん:02/12/08 14:16 ID:???
>>36
>こういう風に書かれたら
っていうことはユーザーの入力を処理するってこと?
それならまずタグの閉じ忘れチェックをすればいいんじゃないかな。

40 :37:02/12/08 15:01 ID:???
@conv{qw(< >)}= ('<', '>');
s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;

41 :37:02/12/08 15:03 ID:???
しっ、失敗・・・ りとらい

@conv{qw(< >)}= ('&lt;', '&gt;');
s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;

42 :nobodyさん:02/12/08 15:05 ID:???
$t = '<code>〜</code>hogehoge</code>';
$t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i;
print $t ;

これでどうよ?

43 :nobodyさん: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 ;

間違ってたらごめんよ。

44 :nobodyさん: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;

痛いな、漏れ。

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

どういうシチュエーションなのかよくわからんちん。
textarea に書き込まれた文字を処理するのか
テンプレートファイルでの処理用のタグを導入してるのか…

46 :nobodyさん:02/12/08 17:51 ID:???
>>45
なにも考えずに正規表現を書き、
足りない部分は脳内補完、
がこのスレの主旨・・・なのか?


47 :Name_Not_Found:02/12/08 18:00 ID:cySwFV0O
なんか、ここ最近の流れみてるとそうらしいですね。
指摘すると切れるし。

48 :nobodyさん:02/12/08 18:26 ID:???
単に質問の仕方が悪いだけだろうよ。

49 :Name_Not_Found:02/12/09 06:04 ID:7ZfXL1H9
まあ脊髄反射で答えるのは双方のためにならんってこった。

50 :nobodyさん:02/12/09 11:29 ID:N8zphpYN
整数と小数を許可する正規表現を書きたいと思って
↓を書いてみました。

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

でも、これだと必ず小数点を書かないといけません…。
例えば「12」という数値を通したい場合
「12.0」にしないとエラーになってしまうのです。
「12」でも通るようにするためにはどう書けば良いのでしょうか。

51 :nobodyさん:02/12/09 11:50 ID:???
^-?\d+(?:\.\d+)?$

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

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

52 :50:02/12/09 12:07 ID:???
負数も許可したくなかったので

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

とすると希望の動作しました!ありがとうございます。

53 :50:02/12/09 12:31 ID:N8zphpYN
先ほど教えていただいた
^\d+(?:\.\d+)?$
これを丸々否定したいのですが、

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

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

何がやりたいかというと、とあるcgiでの入力チェックを行う際に
「有効書式設定」「無効書式設定」というのがあります。
そこにフォームからの入力チェックを正規表現で設定できるのですが、
「有効書式設定」に先ほどの正規表現を入力すると
必ず入力しなくてはならなくなりました。
ですので「無効書式設定」に先ほどの正規表現を
丸々否定したものをすれば、必ず入力しなくても良くなるのでは
と思って質問させていただいてます。

54 :nobodyさん:02/12/09 13:39 ID:???
>>53
!~ /^\d+(?:\.\d+)?$ /

55 :50:02/12/09 17:05 ID:N8zphpYN
>>54
許可したくないものまで許可できてしまいました…。
ですので、「整数と小数、または、0文字を許可」という条件を
「有効書式設定」の所に設定し直そうと思います。
整数と小数の部分は
^\d+(?:\.\d+)?$
でいけてるのですが「または、0文字を許可」の部分を
↑にどのように付け加えればよいのかわかりません。。
すいませんがよろしくお願いします。

56 :Name_Not_Found:02/12/09 17:29 ID:Pf18ytiH
>>55
0文字を許可を入れる場合の定石は、
処理ループの(ループだよね?)最初で /^$/ 等でマッチさせる。

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

"または" がきたら、普通に if とかの使用も考えること。

57 :55:02/12/09 17:40 ID:N8zphpYN
>>56
今回、cgiそのものを書いているのではなく
cgiを設定する画面が存在して、その「有効書式設定」部分に
正規表現を書けば、自動的に入力チェックを行ってくれるというものです。

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

cgiのこのテキストボックスに書くって感じです。
なので、一つの正規表現で解決させたいです。。


58 :Name_Not_Found:02/12/09 17:48 ID:???
>>57
なるほど。でしたら、

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

で。

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

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

で。

59 :57:02/12/09 18:19 ID:???
>>58
ありがとうございます!!!
これでばっちりです!
本当に助かりました…。

60 :36:02/12/09 18:50 ID:???
遅くなってスミマセン。

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

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

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

かなり悩んでいたので、助かりました。感謝です!

61 :nobodyさん:02/12/09 23:44 ID:???
ところで、37さんのと44さんのではどちらが効率が良いのでしょうか?


62 :nobodyさん:02/12/10 03:45 ID:???
perlの正規表現でhttp://〜を<a href〜>つけてリンクにするのは
どんな表現方法が一番いいのでしょうか?

63 :nobodyさん:02/12/10 06:27 ID:QO7zNhpw
すいません、複数の語句に対してマッチするかどうかしらべてるんですけど
何に対してマッチしたかがわかりません。
例えば

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

みたいな処理をする場合、さっきマッチした語句を調べるにはどうしたらいいのでしょうか?
$_ とか$1を当てはめても上手くいかないんですが。
お願いします。

64 :63:02/12/10 06:34 ID:???
$&ですね、逝ってきます‥‥

65 :nobodyさん: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」という風に
一番最後にある「&」で区切られてしまいます。
最初に出くわした「&」で区切りたい、という時にはどうしたらいいんでしょうか?





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

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

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

文字コードはShift_JISです。どういう風にすれば文字化けを回避できるでしょうか?

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

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

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

試してないからわからないけど、これでどうでしょう?


68 :Name_Not_Found:02/12/10 10:18 ID:???
>>67
括弧余計すぎた。
そと側の (?: .. ) はいらないわな…

69 :65:02/12/10 10:46 ID:???
>>67
ありがとうございます、理解できました。

70 :Name_Not_Found:02/12/10 11:42 ID:SHy7dsCG
>>69
ただ、.*? は遅くなることがあるから、
この場合は [^&]*& の方が望ましいです。

71 :nobodyさん:02/12/10 12:21 ID:???
http://〜〜〜〜 のURLを検出する正規表現で
速いのってどんなやつ?
kentでは
$test =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target=\"_top\">$2<\/a>/g;
ってやってるみたいだけど これ遅くない?

72 :nobodyさん:02/12/10 12:26 ID:???
>>71
([^=^\"]|^)って何? いらないんじゃ……

73 :nobodyさん:02/12/10 12:29 ID:???
>>71
シラソ
kentのやつみたらそうなってた。

多少曖昧でもいいから速いマッチング方法キボン

74 :72:02/12/10 12:44 ID:???
最初の部分はすでにA要素がある場合の対策かな。
それを削ってこんな感じ。
$test =~ s/(https?\:\/\/[a-zA-Z\.\~\-\/\?\&\=\@\;\#\:\%_!*'()]+)/<a href=\"$1\">$1<\/a>/g;
ちなみに、[]内はURI使える文字だけど、kentのは不足している。
動作確認していないので、フォローよろしく。

75 :72:02/12/10 12:59 ID:???
ごめん、0-9抜けてた。\のいらない記号もあると思う。
$test =~ s/(https?\:\/\/[-a-zA-Z0-9.~\/?&=\@;#:%_!*'()+\$,]+)/<a href=\"$1\">$1<\/a>/g;

76 :nobodyさん:02/12/10 14:39 ID:???
$test =~ s/(https?\:\/\/[\S]+)/<a href=\"$1\">$1<\/a>/g;
ではダメ?

77 :76:02/12/10 14:41 ID:???
'<''>'は排除しなきゃか・・・

78 :76:02/12/10 14:44 ID:???
$test =~ s/(https?\:\/\/[\S<>"']+)/<a href=\"$1\">$1<\/a>/g;
かな?

79 :76:02/12/10 14:45 ID:???
$test =~ s/(https?\:\/\/[^\s<>"']+)/<a href=\"$1\">$1<\/a>/g;
だ・・・鬱

80 :nobodyさん:02/12/10 15:03 ID:???
>>49

81 :76:02/12/10 15:19 ID:???
>>80
御意

82 :nobodyさん:02/12/10 16:26 ID:???
>>76
日本語もリンクするのか?

83 :nobodyさん:02/12/10 16:33 ID:???
>>82
2バイト文字を使うウマシカに付ける薬によいのでは?(w

84 :nobodyさん:02/12/10 16:45 ID:???
多国語ドメインがRFCになるとURLの切り出しがウザそう

85 :Name_Not_Found:02/12/10 17:02 ID:???
>>84
それよか、IRIなんてのがひかえてますよ。


86 :66:02/12/10 22:19 ID:???
>>67
ありがとうございます。1バイト目の文字は
\x81-\x9F\xE0-\xFC
ですが、その通りにしてもなぜか>が消えてしまうようです???
例えば<BR>の次に[が来ていると、
<br? こうなってしまいます。

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

見当違いならすみません・・・

87 :nobodyさん:02/12/10 22:27 ID:???
s/(?=[\x81-\x9F\xE0-\xFC])\[/&#91;/g;

これだと、上手くいったような気がします。
>>67さん、ありがとうございました!

88 :66:02/12/10 22:29 ID:???
と思ったらエスケープされてませんでした・・・

89 :nobodyさん:02/12/10 23:02 ID:???
if ($hoge ne 'bookmark' && $hoge=~ /(?:(?!cache).)*/) {

$hogeが'bookmark'だとちゃんと弾くけどcacheが入ってる場合に弾いてくれない。
http://www.din.or.jp/~ohzaki/regex.htm#Without
ここのやつの意味を勘違いしてるのかなぁ。

90 :nobodyさん:02/12/10 23:22 ID:???
/^(?:(?!cache).)*$/

91 :nobodyさん:02/12/10 23:37 ID:???
>>90
ありがとうございます出来ました。


92 :Name_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 あたりなら大丈夫。


93 :66: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つ以上ある場合はどうしたらいいのでしょうか。


95 :94:02/12/11 17:49 ID:YVHUV6QH
$foo =~ s/(&gt;&gt;)([1-9][0-9]*)/<a href="#$2">$1$2<\/a>/g;
でございます。

96 :Name_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;


97 :96:02/12/11 18:08 ID:???
ミスッた。
$value ってなんじゃ…
$1 ね。

98 :94:02/12/11 18:11 ID:YVHUV6QH
>>96 早速ありがとうございます。やってみます。

99 :94:02/12/11 18:49 ID:YVHUV6QH
なぜかうまくいきません。
恐れながら、$1は、>>にマッチするのではないですか?
すみません教えてください。


100 :96: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;


101 :96:02/12/11 20:31 ID:7uJNDqfw
というか (?:...) を使う意味ないじゃんね…
意味無いんで外しといてください。


102 :94:02/12/12 00:14 ID:pDUwoT6Y
ありがとうございました。


103 :nobodyさん:02/12/24 22:43 ID:???
http://pc.2ch.net/test/read.cgi/php/996105815/961

104 :名無しさん:03/01/03 00:29 ID:yu7P73hS
すいません 教えてください。。 
最短マッチが、いろいろ読んだけどわかりません。phpです。

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

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

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

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

なんか基本的なことがわかってないです。


105 :nobodyさん:03/01/03 00:46 ID:nupLg+Ov
.*?

106 :104:03/01/03 01:09 ID:yu7P73hS
/\*.*?\*/ ということでしょうか? なんもでてこないです(;_;)


107 :104:03/01/03 01:23 ID:yu7P73hS
/\*.+?\*/ でもでてこないです。なんか勘違いしてるのでしょうか
教えてください・・・

108 :nobodyさん:03/01/03 01:27 ID:nupLg+Ov
うぅーそれ以上はわからない・・

もしかしたらereg()で最短一致は使えないのかも。
preg_replaceでなら上手くいくかも。

109 :104:03/01/03 01:40 ID:yu7P73hS
ありがとうございます・・
でもpregでもできません・・(;_;)
というか、なにも表示されないというのがアヤシイです。。

110 :nobodyさん:03/01/03 01:41 ID:???
そんなあなたにPerlをお奨めしますです。。。

111 :nobodyさん:03/01/03 17:38 ID:???
$hoge=$1 if($text=~/(ソ+)/);

このように書いてもソが脳内通りに取得出来ないんですが
どうすればいいんでしょうか?

112 :nobodyさん:03/01/03 21:33 ID:nupLg+Ov
$hoge=$1 if($text=~/((?:ソ)+)/);

113 :111:03/01/04 17:33 ID:???
>>112
無事成功しました。
ありがとうございました。

114 :山崎渉:03/01/15 13:36 ID:???
(^^)

115 :nobodyさん: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抽出部分はこんな感じです。


116 :nobodyさん:03/01/18 13:45 ID:hA2YqZMs
変な日本語ですみません。頭がボーとしてて・・・

117 :nobodyさん:03/01/18 15:29 ID:???
>>115
じゃあ、抽出後に<>を置き換える。
後、$1と$2、どうせ結合するならまとめて括弧でくくればいいのに。


118 :115: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が続く場合等に予期しない結果になってしまいます。

119 :nobodyさん:03/01/18 19:01 ID:???
>>118
俺ならタグ付けは表示時に行う。データに妙な情報付けたくないんで。

120 :115:03/01/18 19:23 ID:hA2YqZMs
>>119
表示時にタグ付けすると解決する?

121 :nobodyさん:03/01/18 19:30 ID:???
>>120
そだろ。

122 :115:03/01/18 19:33 ID:???
でもデータは
&lt;a href=&quot;http://www.yahoo.co.jp/&quot;&gt;Yahoo&lt;/&gt;
とかになるわけで・・・


123 :nobodyさん:03/01/18 19:38 ID:???
>>122
なんでやねん。

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

表示:
<a href="http://www.2ch.net">http://www.2ch.net</a>って死ぬほどおもしれー!


124 :115:03/01/18 19:47 ID:???
違う違う。ユーザが、
<a href="http://www.yahoo.co.jp/">Yahoo!</a>
と投稿した場合。
char str[]="http://www.yahoo.co.jp/";
等でも同じ。(この場合はco.jpの後の"もリンク扱いされてしまう)

125 :nobodyさん:03/01/18 19:51 ID:???
>>124
やめさせろ。以上。

126 :nobodyさん:03/01/18 19:54 ID:???
>>124
<.*?(\"([^\"]+?)\".*?)*..?>

127 :nobodyさん: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 のなかの"/"をエスケープしなくても
エラーにならないんでしょうか?

128 :nobodyさん:03/01/20 08:08 ID:???
>>127
http\/\/:[www\.]?2ch\.net\/

129 :nobodyさん:03/01/20 08:09 ID:???
ごめん。まだ寝てるわ
http\/\/:(www\.)?2ch\.net\/


130 :nobodyさん:03/01/20 11:15 ID:???
>>127
> エラーにならないんでしょうか?
エラーになったら誰も使わなくなるから(w

131 :nobodyさん:03/01/20 19:22 ID:gSzazTge
>>127
Perlだと、こう書く。
m#^http//:(?:www\.)?2ch\.net/$#

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

今の場合は、単に正規表現を聞いてるんだから、/をエスケープする必要は無いし、
それに、Perlで使うときも、いちいち/をエスケープするのは、エレガントじゃない。

132 :nobodyさん: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なんでしょうか?
そのへんの理屈がよく分かりません

133 :nobodyさん:03/01/20 21:52 ID:gSzazTge
構文解析時には、変数は展開されていない。
から、インタプリタはs/ / /を認識できる。

134 :nobodyさん: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を展開部用のスタックに積み込んでいるのではなかろうか。

あくまでも想像。

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

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

というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。

136 :nobodyさん:03/01/22 11:42 ID:???
>>135
`grep hoge`

137 :nobodyさん:03/01/22 11:44 ID:???
>>135
foreach(@hoge)
{
if(/^.*key.*$/)
{
push(@a,$_);
}
}
で、良いじゃん。正規表現が合ってるかはは知らんけれど


138 :nobodyさん:03/01/22 12:04 ID:Lm4zDQtU
>>136
grepが使えたらこんな事はしないかと。

>>137
if等は使えないんですよ。
つまりエディタの検索、置換えに指定する事でgrepするようなものです。

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

使えない理由になるの?

140 :nobodyさん:03/01/22 14:10 ID:Lm4zDQtU
>>139
例えですけど、メモ帳の置換えでif使えますか?
マクロじゃないですので使えないです。

141 :nobodyさん:03/01/22 14:35 ID:???
>>140
何を訳のわからんことを。
例えダイアログで指定出来るパラメータが一つでも、内部処理ではアホほどif文が多用されているが。


142 :nobodyさん:03/01/22 15:50 ID:???
>>141
内部処理にいくらIFが使われてようが関係ないぞ。
って何の話してるんだ?

143 :nobodyさん:03/01/22 15:51 ID:???
>>142
こっちが聞きたいよ。

144 :nobodyさん:03/01/22 15:59 ID:???
エディタの中の人も大変だな

145 :nobodyさん:03/01/22 16:47 ID:Lm4zDQtU
>>141
何か大きく勘違いなされてるようで。
とにかく、1行(s/find/rep/)の構文だけでgrepと同じ事を出来ないかと言う事です。

スクリプトを組めるなら最初からそうしますが
制約上そのような事ができません。


146 :nobodyさん:03/01/22 16:49 ID:???
>>145
何か根本的に勘違いなされているようなので。

147 :nobodyさん:03/01/22 17:30 ID:Lm4zDQtU
>>146
どういう事でしょうか?

148 :nobodyさん:03/01/22 17:36 ID:???
>>147
はじめから落ち着いて、

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

位は書いてくれい。

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

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

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

です。以上で分かって頂けるでしょうか?

150 :nobodyさん:03/01/22 17:58 ID:???
>>149
はじめからそう書いてくれれば良かったのにね。
無理でしょ。

151 :nobodyさん:03/01/22 18:06 ID:Lm4zDQtU
>>150
何故無理と言い切れるのでしょうか?

152 :nobodyさん:03/01/22 18:18 ID:???
Perlで描いてドロップレットで一発変換。

153 :nobodyさん:03/01/22 22:05 ID:NkPjRdCp
あ、わかった。>>135は、
正規表現は、置換にも使えると聞き、検索っていうとこで、正規表現をオンにして、
自慢のコードをつっこんでみたが、ちゃんと動かないので、調べるのは面倒だから、
2chに書き込んでみた。でどうだ。

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

キボンヌって言えば仲間になるから大丈夫だと思っていたら大間違いだぞ。

154 :nobodyさん:03/01/22 22:06 ID:???
>>153
マルチにマジレス、カコワルイ。

155 :nobodyさん:03/01/23 00:35 ID:???
>>144
 ああ!ごめん、見逃してた!反応遅くなっちゃってごめん。
 ・・・では改めて。

 中 の 人 な ど い な い !


156 :nobodyさん:03/01/23 07:11 ID:???
>>153-154
ジサクジエンでした。

157 :nobodyさん:03/01/23 07:48 ID:???
>>155->>144
ジサクジエンデシタ


158 :nobodyさん:03/01/28 00:31 ID:2+2ZA9Pr
ググル(crawl4.googlebot.com他)が来たら〜するというプログラムだけど、
if($ENV{'REMOTE_HOST'}=~/crawl[\d]+\.googlebot\.com/){⊥}
でいいのけ?

159 :nobodyさん:03/01/28 00:52 ID:???
>>158
$robots = "crawl4.googlebot.com";
if($robots =~ /crawl[\d]+\.googlebot\.com/ ){ print "kita----!!";}
をローカル環境でテストしてみる。

160 :nobodyさん: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


42 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)