- ベストアンサー
3回以上連続する文字(どんな文字でも)を削除する方法
3回以上連続する文字(どんな文字でも)を削除する方法 お世話になります。 掲示板等の文字列で、、、 ■■■■■■■■ や ========= といった連続する文字列を削除したいと思っています。 その際「3回以上、同じ文字がつづいているものは、根こそぎ削除」という形にしたいと思い、 ~s///g; を用いて、あれこれやっているのですが (また、ぐぐって、あれこれ調べたのですが) 全く、うまくいきません。 どの様にすれば、うまくいくのか、アドバイスいただければ幸いです。
- みんなの回答 (4)
- 専門家の回答
補足
ryu_chanさん、アドバイスいただき、ありがとうございます!! >Shift-JIS限定なら以下の正規表現でいけそうな気もします(あまり自信なし)。 実は、今一度確認してみたところ、てっきり、Shift-JISエンコード保存だと思い込んでいた、融合させたい私の既存プログラム書類は、「日本語(MacOS)エンコード」という、独特な?(Shit-jisの亜種?)エンコードで保存されている事が分かりました。(^_^;) で、このエンコードの場合、「\」は使えず「¥」で表現する様になっており、上記書かれているものを、¥に変換した、、、 $moji =~s/([¥x00-¥x7F¥xA1-¥xDF]|[¥x81-¥x9F¥xE0-¥xFC][¥x40-¥x7E¥x80-¥xFC])¥1¥1+//g; で、うまくいきました!! ありがとうございます! (どこかのサイトで、「¥」は使うべきではない!という記述を見かけたことがあるのですが、、、、w) で、上記式は、sara9647さんが提示されている「s/(.)\1\1//g」の「(.)」の部分に、「([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]」を当てはめたものなのですね。 で、ぐぐったところ、「\x00-\x7F\xA1-\xDF」は1バイトSHIT-JIS文字、「[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])」は2バイト SJIS文字ということが分かり、このどちらかの文字クラスの3回以上の連続にマッチした場合、削除する、というやり方の様ですね(解釈が間違っていたらご指摘下さい) とした場合、sara9647さんが使われている「(.)」の意味も知っておきたいのですが、いくら、ぐぐっても、これが分かりませんでした(グーグルは、こーいった記号のみの検索で威力が発揮できない様で、、、、「Perl (.) マッチ 」でも、何もひっかかってきません。。。 私のPerlメモ帳(備忘録)には、、、、 「.* 」が、何かの文字列にマッチさせたい時に使うものとあり、 「([^<]*) 」が、どんな複数の文字列でもマッチさせる時に使うもの、とあります。 ですので、てっきりsara9647さんの式は、、、 s/(.*)\1\1//g だと思っていたのですが、実際は、、、 s/(.)\1\1//g なのですね。 できましたら、その理由などもご教授いただければ幸いです。 ※尚、ryu_chanさんのプログラムと、その表示結果を以下記しておきます。 ----------------------------- #!/usr/local/bin/perl print <<"HTML"; Content-type: text/html <html> HTML $moji="aiiuuueeeeoooooooooooo"; $moji =~s/([¥x00-¥x7F¥xA1-¥xDF]|[¥x81-¥x9F¥xE0-¥xFC][¥x40-¥x7E¥x80-¥xFC])¥1¥1+//g; print $moji."<br><br>"; $moji="あいいうううええええおおおおおかかかかかかかかかかかかか"; $moji =~s/([¥x00-¥x7F¥xA1-¥xDF]|[¥x81-¥x9F¥xE0-¥xFC][¥x40-¥x7E¥x80-¥xFC])¥1¥1+//g; print $moji."<br><br>"; $moji="★★■■■□□□□◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆"; $moji =~s/([¥x00-¥x7F¥xA1-¥xDF]|[¥x81-¥x9F¥xE0-¥xFC][¥x40-¥x7E¥x80-¥xFC])¥1¥1+//g; print $moji."<br><br>"; ----------------------------- 表示結果 ----------------------------- aii あいい ★★ ----------------------------- ※3文字以上のものは「根こそぎ」削除される理想のプログラムでした。 (ryu_chanさん、重ね重ね、教えていただき、ありがとうございます!)