トップページ⇒php
981コメント301KB

正規表現道場@2ch Part4

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

註:& や " を書くときには、& " と描いておきましょうね。

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

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 http://pc5.2ch.net/test/read.cgi/php/1069245758/
0756nobodyさん2005/10/11(火) 13:37:02ID:???
http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
↑こちらに 「入れ子を許した括弧内にマッチさせる」 正規表現が載ってるんですが、
残念ながら perl5.5 以前では (??{〜}) の書きかたがサポートされていません。
その場合、どのように書けばいいでしょうか? 数行に渡ってもいいです。
0757nobodyさん2005/10/11(火) 14:54:34ID:???
無理ったら無理。入れ子の深さを限定すればなんとか。
0758nobodyさん2005/10/11(火) 15:03:55ID:???
無理とか言わないでw
「数行」 ってのは正規表現以外の処理入ってもよくて、例えば、

my $string = 'aa {bb} cc { dd {ee} } ff { gg { hh { ii { jj } kk } ll } mm } nn';

1 while ($string =~ s/(\{(?>[^{}]*))\{((?>[^\}]*))\}/$1\x11$2\x12/); # 中のカッコを一旦escape

while ($string =~ /(\{[^{}]*\})/g) {
    local $_ = $1;
    tr/\x11\x12/{}/; # 中のカッコをunescape
    print $_, "\n";
}

これより上手い方法思いついたら教えてほしいのですr
0759nobodyさん2005/10/11(火) 15:59:26ID:???
>>758
正規表現以外の処理を前提にするなら、それは正規表現スレで
する質問では無くなるよな。各言語のスレへお行き。
0760nobodyさん2005/10/11(火) 16:07:28ID:???
>>759
いや、そりゃそうなんだけど、
もっとうまい正規表現があるかと思って疑問に思った核が正規表現の部分なんだから、このスレでいいかと思ったんだけどな。
perl板に行っても正規表現スレに行けって言われるのがオチなので、ダメなら諦めるわ。
0761nobodyさん2005/10/11(火) 16:16:08ID:???
> 正規表現スレに行けって言われるのがオチ
そんなことはないと思うけどなあ。
Perl でのアルゴリズムの話でもあると思うので、
厶板 Perl スレあたりで聞いてみるのもアリかと。
0762nobodyさん2005/10/11(火) 17:17:22ID:???
外部エンジンを使うんだ
0763nobodyさん2005/10/11(火) 18:33:57ID:???
> 外部エンジン
詳しく!
0764nobodyさん2005/10/12(水) 22:20:33ID:enZtkyi2
正規表現で、半角数字と記号のみ弾く上手い書き方は無いでしょうか?
現在はこんな感じで書いていますが「ー」などを弾いてしまうので困っています。
if( !preg_match("/[0-9\x\-\x(\x)\x[\x\]\x<\x>\x?\x\/\x\.\x\+\x\*\x_\x!\x#\x\$\x%\x~\x\|\x\@\x;\x,\x`\x{\x}]/", $R_um_name1) ){
$ERROR=$ERROR.'エラー<br>'."\n";
}
0765nobodyさん2005/10/12(水) 22:23:30ID:???
>>764
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0766nobodyさん2005/10/12(水) 23:37:14ID:???
>>764
thxです!
0767nobodyさん2005/10/13(木) 00:27:53ID:???
2chのsubject.txtをスレッドキー、スレ名、件数に分割するにはどうすれば良いのでしょうか?
現在、「.dat<>」と「 (」で分割してるのですが、
0000000000.dat<>スレッドタイトル (レス数)
という形式だけでなく、スレ数の括弧が全角だったりするところもありますorz
誰か教えてください
0768nobodyさん2005/10/13(木) 00:56:37ID:???
正規表現道場 へ よ う こ そ !
                  .ノ′    } 〕    ,ノ           .゙'┬′   .,ノ
                  ノ      } ゙l、   」′           .,/′   .,ノ _,,y
    .,v─ーv_         〕      〕 .|  .il゙            《 ._   .,,l(ノ^ノ
   ,i(厂  _,,,从vy      .,i「      .》;ト-v,|l′          _,ノ゙|.ミ,.゙'=,/┴y/
   l  ,zll^゙″  ゙ミ    .ノ       .il|′アll!           .>‐〕 \ _><
   《 il|′     フーv,_ .,i″       ||}ーvrリ、             ¨'‐.`   {
    \《 ヽ     .゙li ._¨''ーv,,_     .》′  ゙゙ミ| ,r′                }
      \ ,゙r_    lア'    .゙⌒>-vzト    .ミノ′                 〕
       .゙'=ミ:┐  .「      ./ .^〃     :、_ リ                   .}
         ゙\ア'   .--  ,,ノ|    、    ゙ミ}                   :ト
           ゙^ー、,,,¨ -   ''¨.─   :!.,   リ                   ノ
              〔^ー-v、,,,_,:     i゙「   }                  .,l゙
              l!     .´゙フ'ーv .,y    ]                  '゙ミ
              |     ,/゙ .ミ;.´.‐    .]                   ミ,
              |     ノ′ ヽ      〔                   ミ
              }    }     ′    }                   {
              .|    .ミ     .<     〔                    〕
              .{     \,_   _》、    .{                    .}
              {      ¨^^¨′¨'ー-v-r《                    〔
0769nobodyさん2005/10/13(木) 10:37:30ID:???
>>767
ココは正規表現スレです。詳しい仕様がなければ回答しません。
貴方は調べるのを面倒に感じて投げ出したのに、我々に資料集めからやれと仰るのでしょうか?
オープンソースな2chブラウザのコードを見るという手もありますが、それはこのスレの範疇にありません。
具体的な仕様の提示・スレの移動 の何れかを選択してください。
0770nobodyさん2005/10/13(木) 12:20:37ID:4gxpiBDK
>>768
立派なモノをお持ちですねw
0771nobodyさん2005/10/13(木) 14:24:35ID:???
>>770
なるほど、大人の正規表現ですな。
0772nobodyさん2005/10/13(木) 14:40:34ID:???
>>767
2ch の仕様は、なにはともあれまずは monazilla.org(w の資料室を調べてみれ。
それ見てまたわかんないことがあったら、
どこまで頑張ってみたかコードを示してまたおいで。

http://www.monazilla.org/
http://www.monazilla.org/document/subjecttxt2001.html
0773nobodyさん2005/10/13(木) 15:13:39ID:???
>>772
foreach($tmp as $value) {
$tmp = split("<>", $value);
if($tmp[0]) {
$thread['key'] = $tmp[0];
list($thread['name'], $thread['res']) = split(" \(", $tmp[1]);
list($thread['key'], $tmp) = split(".dat", $thread['key']);
list($thread['res'], $tmp) = split(")", $thread['res']);
printf("\n<TR><TD><A href=\"%d\">%d</A></TD><TD>%s</TD><TD>%s</TD></TR>", $thread['key'], $thread['key'], $thread['name'], $thread['res']);
}
}
現在は、試行錯誤を繰り返しながら分割でやっているのですが、「 (」がタイトルにあると失敗します。
07747732005/10/13(木) 15:32:40ID:???
適当にやってみたんだけど
$tmp = preg_match("/^([0-9]+)\.dat(<>|,)(.*) (\(|(|<)([0-9]+)(\)|)|>)$/", $tmp, $match);
でいいのかな・・・
111111111.dat<>テスト (実験用) (2) Part2 (100)
↓
Array
(
[0] => 111111111.dat<>テスト (実験用) (2) Part2 (100)
[1] => 111111111
[2] => <>
[3] => テスト (実験用) (2) Part2
[4] => (
[5] => 100
[6] => )
)
0775nobodyさん2005/10/14(金) 20:27:52ID:???
>>768 は 「それは性器表現だ!」 ってツッコミを期待していたのかな。
0776Jeffrey E.Friedl2005/10/15(土) 20:57:56ID:???
gaishutsu desu
0777nobodyさん2005/10/15(土) 21:49:52ID:???
777get, zuzaa
0778nobodyさん2005/10/21(金) 13:24:56ID:???
>>727
^(\d+)\.dat<>(.*)(?:\(|()(\d+)(?:\)|))
これで抽出できるはず
0779nobodyさん2005/10/21(金) 13:27:28ID:???
アンカー間違えた…>>767
0780nobodyさん2005/10/28(金) 06:06:55ID:???
質問です。
vbsで2ちゃんのidxファイル内のスレ数が抽出できません。
(\t)\8[^(\t)](\t)\9
0781nobodyさん2005/11/06(日) 23:27:29ID:???
.
0782nobodyさん2005/11/08(火) 22:59:53ID:???
質問お願いします。

grepで、ファイルから行を抽出したいんですが、
文字列1か、文字列2のどちらかを含む行の条件の指定って
どのように書けばよろしいのでしょうか?
0783nobodyさん2005/11/08(火) 23:05:58ID:???
>>782
(文字列1|文字列2)
でいいんじゃないか?
0784nobodyさん2005/11/08(火) 23:11:09ID:???
grepなら
\(文字列1|文字列2\)
でした
07857822005/11/09(水) 09:49:48ID:???
>>783
レスありがとうございます。
早速試してみたのですが、どうもうまくいきません。

>>783だとsyntax errorで、
>>784だと、
grep \(s1|s2\) file だと、パイプの前後で別のコマンドとして扱われ、
s2):comannd not foundになってしまいます。
環境はCygwinなんですが・・・
0786nobodyさん2005/11/09(水) 12:15:36ID:???
相対パスを絶対パスに変換するにはどうすれば良いでしょうか?
言語はPHPです。

出力直前にHTMLを一括で変換しようと思っているのですが、
元のHTMLが汚く、以下のように書き方がバラバラで困っています・・・

<img src="/lib/aaa.gif">
<img src=/lib/aaa.gif>  ← ダブルクォーテーションなし
<img src='/lib/aaa.gif'> ← シングルクォーテーション
<img src=lib/aaa.gif> ← 最初のスラッシュなし
0787nobodyさん2005/11/09(水) 14:44:34ID:???
>>786
まず元の HTML の書式を統一させるように変換をかけてから、パスの変換をかけるといいかも。
あるいは元の HTML 自体をあらかじめ直しておくか。


いずれにせよ、一発で全部やるのは効率悪いと思う。
0788nobodyさん2005/11/09(水) 15:29:52ID:???
PHPの正規表現なんですが、現在
([0-9][=+]?)
が64個並んでいます。

マッチした()の中身を出力するためなのですが、
([0-8][=+]?){64}
ではダメでした。

何かいい方法はあるんでしょうか?
07897882005/11/09(水) 15:42:44ID:???
>>786
ページパスと相対パスで、絶対パスを出力する関数作って、
そこに切り出してきた相対パスを放り込む作戦はやったことがある。

>>788
下側は ([0-9][=+]?){64} の間違い。
0790nobodyさん2005/11/09(水) 16:17:07ID:???
>>788
preg_match_all()じゃだめなのか。
07917882005/11/09(水) 16:21:49ID:???
>>790
存在を忘れてました...orz
吊ってきます
0792nobodyさん2005/11/09(水) 20:45:26ID:ySyrfo3j
助けてください!
phpなんですが

$url = "http://www.hoge.com/です。http://www.ho-ge.com/もよろしく!";
$url = ereg_replace( "(http://[[:alnum:]\S!#\$%&=-~@;\+:\*,\./\?_]+)", "<a href='\\1' target='_blank'>\\1</a>", $url );

とすると、-が正規表現の対象から外れているんですがなにが悪いんでしょうか?
0793nobodyさん2005/11/09(水) 20:48:39ID:???
>>792
-をエスケープ汁
[]の中にそのまま書くと左から右までの範囲という意味
0794nobodyさん2005/11/09(水) 20:50:57ID:???
-を最後に盛ってきたらいけました。

あと、あげてすみませんでした。
0795nobodyさん2005/11/09(水) 20:51:31ID:???
エスケープしてもだめだったんです。
0796nobodyさん2005/11/09(水) 22:59:58ID:???
上の例で \- みたいにエスケープすると \-~ となってしまって、
ASCII コードで '\' から '~' までの範囲の意味になっちゃうからかな。
>>794 みたいに文字クラスの先頭 (もしくは最後) に盛ってくるのが無難な希ガス。
0797nobodyさん2005/11/10(木) 00:09:07ID:???
eregではそうだったのか…いいかげんなこといってごめん
0798nobodyさん2005/11/10(木) 01:27:42ID:???
eregに限らんがな
0799nobodyさん2005/11/10(木) 19:39:04ID:???
[email protected]
@より後ろの文字列を取得したい場合の正規表現を教えてくださいませ
(この例の場合、def.ghiを取得したいです)
0800nobodyさん2005/11/10(木) 20:20:35ID:???
自分でどこまで試したか努力のあとが見られない質問者には厳しいスレ。
0801nobodyさん2005/11/10(木) 20:47:37ID:???

>>799

def.ghi

二度と書き込むな、クズ
0802nobodyさん2005/11/10(木) 23:17:22ID:???
ここは道場だ。
入門者はそれなりの覚悟を持って欲しい。
0803nobodyさん2005/11/11(金) 00:54:56ID:???
>>799ではないけどできた。正規表現初心者よりv
0804nobodyさん2005/11/11(金) 13:03:02ID:BiZLdrp5
11月11日11月12日11月13日・・・と連続している場合、
はじめの11月11日だ毛を取りたいです。
月=>11, 日=>11

教えてくださいませーーー
0805nobodyさん2005/11/11(金) 14:35:32ID:???
>>1 の「使用言語や得たい結果をなるべく詳しく書きましょう」が読めない香具師が大勢・・・
0806nobodyさん2005/11/11(金) 16:57:45ID:???
>>804
/(\d+)月(\d+)日/ で十分な気が。
0807nobodyさん2005/11/13(日) 03:51:30ID:0sDXu6D3
>>807
123月0日
にもマッチしちゃうじゃん
0808nobodyさん2005/11/13(日) 04:36:28ID:???
費用対効果とか考えたことのない奴が言いそうなことだ。
0809nobodyさん2005/11/16(水) 02:15:16ID:S0o67+2o
困ってます教えて下さい。><
htmlから正規表現を使って一部分を取得したいのですがちょっと引っかかってます。
言語はPHPなんですがperl等でも理解はできるので宜しくお願いします。

簡単に言うと、例えば・・・
$source = "<a href=ttp://aaa.com/>あああ</a>";
と文字列があるとして URLと表示部分を取得するには現在は以下のようにしています。

// = の次から > を含まない全角を含んだ全ての文字が連続する物を取得
// > の次から < を含まない全角を含んだ全ての文字が連続する物を取得
mb_eregi("<a href=((?:(?!>).)*)>((?:(?!<).)*)</a>",$source,$reg);

これで
$reg[1] = "ttp://aaa.com/"
$reg[2] = "あああ"

上記のように取得できたんですが

$source = "<a href=ttp://aaa.com/>あああ</a><a href=ttp://ccc.com/>bbb</a>";
こんなふうに、ヒットする物が繰り返される場合
最初の "ttp://aaa.com/" と "あああ" しか取得できず
次に有る "ttp://ccc.com/" と "ddd" は無視されてしまいます

aタグは複数連なっており、全てではなく場合によって n 個目を取得したいです。
n回目にヒットした物や、次にヒットした物、を得る方法は無いでしょうか?
正規表現で何とかなる問題なのかどうかも解りません。
do while とか使わないと出来ないんでしょうか・・・

※ mb_eregi() は、大文字小文字を区別しないマルチバイト対応な関数です
0810nobodyさん2005/11/16(水) 04:25:06ID:???
>>809
欲張りじゃない繰り返しを覚える。
mb_eregi("<a href=((?:(?!>).)*?)>((?:(?!<).)*?)</a>",$source,$reg);

少し洗練。
mb_eregi("<a href=([^>]*?)>([^<]*?)</a>",$source,$reg);
0811nobodyさん2005/11/16(水) 07:04:27ID:???
[^>]*は常に最小マッチになるから?はいらないよ
0812nobodyさん2005/11/16(水) 10:33:34ID:???
*? でしたか。

有り難うございました><
0813nobodyさん2005/11/20(日) 21:30:03ID:E/P1aLNd
mb_eregi("<a href=(o[^-^]o?)>(;^_^A -_-?)</^-^a>",$source,$reg);
0814nobodyさん2005/11/25(金) 11:16:59ID:t2pzoEwO
VBScriptのRegExpで、メールアドレスのチェックを
正規表現でチェックするプログラムがあったのですが、
プログラム書いた人がもういなくてわかりません。

^([\w\.\-]+)@([\w\.\-]+)$

とかかれてました。

\wはわかるとして、「\.」、「\-」の意味がわかりませんでした。
エスケープ文字なのでしょうか?

でももしそうだとしたら、「[email protected]」
と入力してはじかれてしまうので、そういう意味ではないような気がします。
どなたか教えてもらえないでしょうか?

0815nobodyさん2005/11/25(金) 11:30:49ID:???
.そのもの、-そのものの意味だよ。
0816nobodyさん2005/11/25(金) 11:57:05ID:???
>>815
 そのものの意味なんですね、ありがとうございます。
…ということはいけるはず…ということはプログラムがまずいのか…
0817nobodyさん2005/11/26(土) 01:23:13ID:l7a43yMv
>>814
.@.
こんな文字列にもマッチするのですが・・・
0818nobodyさん2005/11/26(土) 14:03:13ID:???
>>814
これ、ほとんど正規表現でチェックしている意味ないよな〜
実際、真ん中に@が含まれているかどうかだけだし。
0819nobodyさん2005/11/26(土) 15:30:09ID:???
>>818
んなことないっしょ。
2バイト文字や空白や記号みたいにあからさまに不正な文字ははじけるし、
あと、後方参照用にグルーピングしてるみたいから、
チェックだけが目的じゃなさそうだし。
0820nobodyさん2005/11/26(土) 15:48:49ID:RIen9muB
正規表現で9桁の数字をwebページ(下の方の階層も含めて)からさがしたいのですが、
なにかいい案ありませんか?
よろしくおねがいします。
0821nobodyさん2005/11/26(土) 15:51:10ID:???
それは正規表現だけでは無理というもの。
0822nobodyさん2005/11/26(土) 15:56:35ID:RIen9muB
どの板いけばいいのか分からなくて・・
言語は一応Javaでやりたいのですけど・・
0823nobodyさん2005/11/26(土) 16:57:57ID:???
Java means JavaScript?
0824nobodyさん2005/11/26(土) 16:59:12ID:RIen9muB
違います
0825nobodyさん2005/11/26(土) 17:29:33ID:???
「java スパイダー」で検索したら、そのまんまな本が出てきたから、
それを読んでみてはいかが。
0826nobodyさん2005/11/27(日) 01:17:00ID:mxeBXpTz
>>825
ずいぶん前から持ってます。
板違いみたいなので
どっか他のとこ逝ってきます。
ありがとうございました。
0827nobodyさん2005/11/27(日) 03:00:37ID:2DsEIeio
([XY][0-9]+)|([BW][A-F0-9]+)

ってもうちょっとかっこよくかけない?
0828nobodyさん2005/11/27(日) 03:04:30ID:???
>>827
\d使うとか
0829nobodyさん2005/11/27(日) 03:15:49ID:???
posixのsedなんで\dなんてありませんよ
0830nobodyさん2005/11/27(日) 04:19:26ID:???
>>829
そういう肝心なことを先に言わない香具師は、
0831nobodyさん2005/11/27(日) 05:03:40ID:???
>>829
はいはい、わろすわろす。
0832nobodyさん2005/11/27(日) 07:14:44ID:???
>>829
「posixのsed」?
http://www.kt.rim.or.jp/~kbk/regex/regex.html#SED
() のエスケープ忘れはともかく | すら使えんようだが。
0833nobodyさん2005/11/27(日) 08:06:25ID:???
|が使える処理系は(GNU sedとか)あるけど、これもエスケープが必要。
0834nobodyさん2005/11/27(日) 20:11:19ID:???
質問です。
コメントタグが何個かあって、コメントタグからコメントタグまでの内容をえたい場合どういうふうに書けばいいのでしょうか。
/<!--([^-]*)-->(.*)<!--([^-]*)-->/
コメントタグは<!--hoge-->など色々で、上のように書くと、$2には最初のコメントタグから最後のコメントタグが入ってしまいます。
0835nobodyさん2005/11/27(日) 20:13:06ID:???
訂正
$2には最初のコメントタグから最後のコメントタグまでの内容が入ってしまいます。
です。

追記
改行文字は取り払った後なので、含まれていないものとします。
0836nobodyさん2005/11/27(日) 20:18:49ID:???
>>834
Perl で良いんだよね?
コメントとコメントの間が (.*) だと最長マッチしちゃうので、 (.*?) とすると良いと思う。
0837nobodyさん2005/11/27(日) 20:21:56ID:???
>>836
ありがとうございす。うまくいきました。
*?の使い方、頭に叩き込んでおきます。
0838nobodyさん2005/12/04(日) 20:14:17ID:N27X1adx
現在Janeで以下のような正規表現を使っています。現在マッチング範囲が半角数字四桁+αになっていますが、
これを全角数字四桁にもマッチングさせたいんです。
これだけなら出来るのですが、またそのマッチした全角数字を半角に変換して$2に格納したいんです。
どなたかご教授頂けると幸いです。
マッチング対象文字列:([^-#=&\w+>@/×*?])(?!\d000)([1-9]\d{3})([^-\d_*×月日円年時分目→万千億兆人台枚回./@&?=])
変換後文字列:$1http://c.hibi.info/?$2.png
0839nobodyさん2005/12/05(月) 13:49:29ID:???
aaa
のように3文字までではヒットせず、
aaaaaaaaaaaaaaa
のように4文字以上だとヒットするにはどのように書けばいいですか?
0840nobodyさん2005/12/05(月) 13:56:30ID:???
{4,}
0841nobodyさん2005/12/05(月) 13:59:10ID:???
>>840
なるほど・・・
ググりすぎて全然関係ないことを試していたようです。
ありがとうございました。
08428392005/12/05(月) 14:20:07ID:???
もう一つ質問させてください。
phpで書いているのですが、>>839の場合に、
「連続した任意のアルファベットと数字を、その連続した文字の1文字にまとめる」場合はどう書けばいいですか?
aaaaaならaに、abcdeeeeeeeefgならabcdefgにしたいです。

if(preg_match("([a-zA-Z0-9]{4})", $str))
{
$str = preg_replace("([a-zA-Z0-9]{4})", "ここの書き方がわからない…", $str);
}
0843nobodyさん2005/12/05(月) 14:36:45ID:???
サブパターンで最初の一文字をとって後方参照
http://jp.php.net/manual/ja/pcre.pattern.syntax.php

ここの書き方がわからない… は "\$1" か '$1'
0844nobodyさん2005/12/05(月) 14:44:37ID:FuV10sP7
PHPで
aaaa bbbb AND cccc OR dddd eeee
のような文字列の「aaaa」と「bbbb」の間のスペースと
「dddd」と「eeee」の間のスペースを
「 AND 」に置き換えるにはどうしたらいいですか?
0845nobodyさん2005/12/05(月) 14:51:35ID:???
>>844
>>843
0846nobodyさん2005/12/05(月) 14:52:25ID:???
>>843まんまじゃないけど、要は後方参照ってこと。
08478392005/12/05(月) 14:58:09ID:???
>>843さん
ありがとうございます。
後方参照という言葉すら知りませんでしたが、パターンにマッチしたものが一時的にキャッシュされるんですね。
しかし、abcdeeeeeeeefgがfgになってしまいましたorz
abcdにはマッチしてないはずなのになんでだろうなぁ…
0848nobodyさん2005/12/05(月) 15:01:55ID:???
単純に言えば、(a)\1でaaにマッチするわけ

08498392005/12/05(月) 15:17:09ID:???
>>848さん
ありがとうございます。しかし全然わかりませんでしたorz
察するに、"([a-zA-Z0-9]{4})"の部分が悪いのでしょうか・・・?
0850nobodyさん2005/12/05(月) 15:31:39ID:???
>>849
そう
[a-zA-Z0-9]って英数字のどれでもいいわけです。
それが四つでマッチするわけだ。
08518392005/12/05(月) 15:49:46ID:???
>>850さん
なるほど・・・
abcdeeeeeeeeeeeeeeeeeeeefgという文字で試していたのですが、
abcd eeee eeee eeee eeee eeee fg
となって、4文字に達していないfgだけが表示されたんですね・・・
(.)\1 なんてしてみましたがうまく動いてくれませんでしたorz
なんとなく理解できてきたのでいろいろ試してみます。
何度もすみませんでした。
0852nobodyさん2005/12/05(月) 18:36:28ID:xIS9Um0e
Perl 5.8使いです。【や】へのマッチングがうまくいかないのですが、どうやればうまくいくのでしょうか?
エラーは出ないのですが、マッチしてくれません。コードは以下です。
my $data = get("http://profile.yahoo.co.jp/biz/fundamental/4302.html");
$data = decode('EUC-JP', $data);
$data =~ tr/【】//d;
print encode('Shift_JIS', $data);
0853nobodyさん2005/12/05(月) 19:53:04ID:???
(a|b|c) と [abc] の違いは何でしょうか?
0854nobodyさん2005/12/05(月) 20:13:03ID:???
>>851
([a-zA-Z0-9]{4})
これだと"abcd"でも"0123"でもとにかく4文字続いてたらマッチしちゃう。

$str = "aaaaabbccccccddddeeff";
$str = preg_replace( "/([a-zA-Z0-9])$1{3,}/", "$1", $str );
echo "$str\n";

結果:
abbcdeeff

こうしないと。

>>853
[abc]の方が短い。
0855nobodyさん2005/12/05(月) 20:21:42ID:???
>>852
普通にマッチするよ。ソースファイルはEUC?
encodeだかdecodeだかのサブルーチンが悪さしてるんでしょ。
つか、Yahooのhtmlは最初からeucなので、
そのdecodeとかいう処理が要らないのでは?
■ このスレッドは過去ログ倉庫に格納されています