正規表現での置換えについて
- 正規表現を使った置換えについて悩んでいます。カンマで区切られた数字や英字の列を先頭だけ残して別の記号に変換する方法を知りたいです。
- 置換えの例として、222,1,33333を2??,1,3????に、55,22aaを5?,2???に置換えることを考えています。
- このような置換えは可能でしょうか。また、正規表現にはand条件はないようですが、and条件が使えない場合、別の関数で置換えを行う方法を教えていただきたいです。
- ベストアンサー
正規表現での置換えについて
正規表現を使った置換えでどうやったらいいのか悩んでいます。 やり方は、カンマで区切られた数字や英字の列をその先頭だけ残して別の記号(?など)に変換するというものです。 変換例 222,1,33333 は 2??,1,3???? へ置換え 55,22aa は 5?,2??? へ置換え 6 は 6 へ置換え(つまりそのまま) このような置換えをすることは可能でしょうか。 こういう置換えはand条件が使えないと無理なのかなとも思ったりしています。 ただ正規表現にはand条件は無いようですし。(or条件はあるようですが) mb_ereg_replaceを使って明示していただけると助かります。 もちろん複数行になっても問題ありませんし、mb_ereg_replaceでは無理という場合に別の関数を使っていただいても結構です。 よろしくお願いします。
- ankodaisuki
- お礼率58% (43/74)
- PHP
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
pregでよければこんな感じでも <?PHP $str="test\n222,1,33333\n55,22aa\ntest"; $pattern="/(^\w|(?<!,))\w/mis"; $replacement="\\1?"; print $str."<br>"; print preg_replace($pattern ,$replacement,$str); ?>
その他の回答 (2)
- sholmes
- ベストアンサー率81% (89/109)
PHPは見様見真似なのですが、ereg縛りの方が気になったので自分も混ぜて下さい。 http://ideone.com/LD0Oh eオプションを使っているので、\1と\2ぐらいしか使わないとは言え絶対安全なのかはわかりませんが・・・
お礼
回答ありがとうございます。 実は特にmb_ereg_replaceにこだわっていたわけではなく、マルチバイトにも対応できていたら後々便利かなぐらいに考えておりました。 とても参考になりました。
- ky072
- ベストアンサー率60% (85/140)
preg_replace() であれば色々と方法がありますね。 $dst = preg_replace( '/((^|,)[^,])([^,]+)/e', "'\\1'.str_repeat('?',strlen('\\3'))", $src ); mb_ereg_replace() に限定した場合、 ループさせて適用するのも面白いかもしれません。 $t = $src; do { $dst = $t; $t = mb_ereg_replace( '((^|,)[^,][?]*)[^,?]', '\\1?', $dst ); } while( strcmp( $t, $dst ) != 0 ); ※但し、データに元から「?」が含まれていると破綻します。
お礼
回答ありがとうございます。 e修飾子などとても参考になりました。
関連するQ&A
- preg_replaceでの正規表現について
お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。
- ベストアンサー
- PHP
- (C#)1バイトの正規表現
下記のような正規表現による置換をほどこしました。 Buffer=Regex.Replace(Buffer,"^[\x00-\xff]{100}","",RegexOptions.Singleline); 文字列の先頭の100バイトを削除する正規表現ですが、うまく動作しません。 どうも文字コードに問題があるようなのですが、原因のわかる方いらっしゃいますか?
- 締切済み
- C・C++・C#
- 正規表現でお尻から検索
"<a>XXXX<a>XXXXX<a>XXXX" という"<a>"が複数含まれる不定文字列から最後の"<a>"の部分だけを"[LINK]"とereg_replaceを使用して置換したいのですが、最後の"<a>"を示す正規表現の書き方がわからず途方にくれています。 ご教授のほど、宜しくお願いします。
- 締切済み
- PHP
- 正規表現で <span>~</span>で囲まれた文字を別の文字に置換したい
こんにちは。正規表現についてお教えいただけないでしょうか? HTMLページを解析し、<span>と</span>で囲まれた範囲を、別の文字列に置換したいのです。 そこで以下のようにしてみました。 print mb_ereg_replace("<span>.+?</span>","置換文字",$source); しかし<span>ああ </span>と、スペースがないと反応しないようなのです。 正規表現の間違いでしょうか? お教えいただけると助かります。よろしくお願いいたします。
- ベストアンサー
- PHP
- php 正規表現で、\マークを取り除くには?
php で ereg_replace関数を使って¥マークを取り除きたいのですが、 ereg_replace("\\", "",$str); と記述すると Warning: ereg_replace() [function.ereg-replace]: REG_EESCAPE in C:\xampp... とエラーになってしまいます。 どうすれば正規表現により円マークを取り除くことができるのでしょうか?
- ベストアンサー
- PHP
- 正規表現について
正規表現で、最初に出てきた条件に合うものだけマッチさせて置換したく、それ以降に条件に合うものがあってもマッチさせたくないのですが、どうすればいいでしょうか? 現在、オプションはつけてないのですが、最後にマッチしたものがとりだされてしまいます。 ---------------------------------------- s/aaa(.*)ccc/$1/; ・・・・・正規表現 ---------------------------- aaabbbccc : : aaadddccc : aaaeeeccc ---------- だと、eeeに置換されるのですが、bbbに置換したいです。 よろしくお願いします。
- ベストアンサー
- Perl
- エスケープ文字そのものにマッチさせる正規表現
お世話になっております。 PHPの正規表現でエスケープ文字\そのものにマッチさせる正規表現がなかなか作れません。Perl互換のpreg_replaceなども試してみましたがダメでした。エスケープ文字そのものを削除したいのですが、どうしたらよいでしょうか? $value = ereg_replace ('\\', '', $value);//ダメでした。 $value = preg_replace ('/\\/', '', $value);//同様にダメでした。 $value = preg_replace ('/[\\]/', '', $value);//同様にダメでした。 文字列中に\が入っていたり、単独で\があった場合は必要ないので削除するといった感じです。 $value = ereg_replace ('[][}}{)(!"#$%&\\~|*+,/\^\'<>`;:?\\=]', '', $value); これでいけるかと思ったのですが、\だけ残ってしまいます。最後辺りの\\で\文字それ自体にマッチするかと思うんですが…。 わかる方がいらしたらおしえてください。よろしくお願いします。
- ベストアンサー
- PHP
- VBAで正規表現
Excel2000-VBAにてマクロ作成中です。 以下のような処理を正規表現を使用して一発で実行させたいのですが、 正規表現に指定するパターンがわかりません・・・。 どなたがご存知でしたら教えて下さい。 やりたいこと:ある文字列中の中のスペース(半角全角両方)を半角スペースに変換し、 さらに連続している半角スペースを1つに置換したい。 スペースを半角に統一することは、Replace関数で可能かと思っています。
- ベストアンサー
- Visual Basic
お礼
回答ありがとうございます。 戻り読み言明などわかっていなかったことが多くとても参考になりました。 ただ教えていただいた処理の根本的な置換えプロセスがまだ理解できず、応用を利かせることが出来ていません。 (これは他御二方の処理も同じなんですが) そのやり方は、カンマで区切られた数字や英字の列をその先頭と「2文字目」だけ残して別の記号(?など)に変換する、というものです。 変換例 222,1,33333 は 22?,1,33??? へ置換え 55,22aa は 55,22?? へ置換え 6 は 6 へ置換え(つまりそのまま) またこれもNo1さんに限らず助言いただきたいのですが、「言明は消費しない」などのメカニズムも含め、ごく基本的な置換えのプロセス(内部挙動)が理解できる、詳細にわかりやすく説明されたサイトや書籍をがありましたら教えていただけると助かります。 php.netの正規表現マニュアルや他のサイトも読んではいるのですが深い理解には至っていません。 (オライリーの5000円もする正規表現第3版とかですかねやっぱり…)