- ベストアンサー
正規表現の使い方を学ぼう
- 正規表現を使った文字列の置換方法について学びましょう。
- サクラエディターを使用している方への正規表現の使い方の説明です。
- 例えば、削除が行の複数箇所に存在する場合に、最後に出てくる削除より後を削除する方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1 です。 私とORUKA1951さんで、読み取った条件が違っちゃってますね。日本語の解釈に左右されない、具体的な「例文と期待する結果」という説明方法を強く推奨します。 私は「削除する範囲を選択(マッチ)させる」という条件で回答しましたが、「置換により、結果的に削除されれば良い」ということであれば、ORUKA1951さんの言うとおり様々な方法があります。 例えば私の解釈(最後の「削除」を含んで行末まで削除)だと、ORUKA1951さんの b) を変形して、 置換前:(.*)削除.*$ ⇒置換後:\1 …となります。 それと回答ではありませんが…ORUKA1951さん、僭越ながら添削させてください。(きっと向学心のある方だと思いますので。) ORUKA1951さんは、最後の「削除」の次の文字から行末までを削除、と解釈して方法を2つ示したのですよね。 >a) 最後の削除以降を削除 >[^削除]*?$ ⇒ これはダメです。「削除」の後にもし「削」や「除」が入っていると破綻します。また、「削」や「除」を含まない行全体にもマッチします。 それと、「以降」という言葉があいまいになっているような。普通、以上とか以降はそれ自身を含みますよね。 この条件(削除する範囲を選択(マッチ)させる)ですとスマートな正規表現を思い付きませんが、こうなります。 置換前:(?<=削除)((?!削除).)+$ ⇒置換後:(何も書かない) >b) 最後の削除を含む前を残す >(.*削除).*?$ ⇒\1 間違ってはいないですが、この場合 ? は必要ありません。つまり (.*削除).*$ となります。 細かく説明しますと、カッコ内の .* が一旦行末まで食べてそこからバックトラックしていくので、「削除」を発見したときは自然と .*?$ の状態になっているからです。 よく ? は「最短マッチ」と間違った説明がされています。正しくは「非欲張り(Non-Greedy)マッチ」ですのでご注意ください。 このような例が分かりやすいでしょう。AxxAxxxAxB これを A.*?B で検索すると、AxB ではなく AxxAxxxAxB 全体にマッチします。 >削除が2個以上、いくつもある場合、二つ目の削除以降は >([^削除]*削除[^削除]*削除).*?$ a) と同じく、もし「削」や「除」が入っていると破綻します。 それと .* でない検索なら ^ も追加する必要があります。(行頭を避け、好きな位置から食べ始めてしまうため。) ・ n個目の「削除」の次の文字から行末まで削除 置換前:^((?:.*?削除){n}).+$(nに半角数字を入れます) ⇒置換後:\1 ・ n個目の「削除」を含んで行末まで削除 置換前:^((?:.*?削除){x}.*?)削除.*$(xにn-1の半角数字を入れます) ⇒置換後:\1 以上、ご参考になれば幸いです。
その他の回答 (2)
- ORUKA1951
- ベストアンサー率45% (5062/11036)
この様な簡単な場合、色々な方法がありますが a) 最後の削除以降を削除 [^削除]*?$ ⇒ b) 最後の削除を含む前を残す (.*削除).*?$ ⇒\1 >例・正規表現である削除が行の二か所以上あるとき最後に出てくる削除より後を削除したい・ とありながら >この場合「削除」が二か所ありますが後に出てきた「削除」より後を削除したいのです ↑三箇所ありますよ。 この文章どおりなら、後に出てきた--ふたつ目の削除より後ろと言う意味なら 参考) 削除が2個以上、いくつもある場合、二つ目の削除以降は ([^削除]*削除[^削除]*削除).*?$
お礼
早速の回答ありがとうございました。 参考にさせていただきたいと思います。
- pacman_chie
- ベストアンサー率82% (14/17)
言葉だけよりも、具体的なマッチ例を挙げた上で説明を添える方が理解が易しく、話が早いですよ。 あと、削除したいという話で例とするキーワードが「削除」では、読む人が大いに混乱しますね。 例: あいう山田かきく山田さしす山田たちつ マッチ: 最後の山田を含み行末まで 山田たちつ 正規表現: 山田((?!山田).)*$ おまけ: キーワードの挿入を一つだけで済ます (山田)(?:(?!\1).)*$
お礼
早速の回答ありがとうございます。 質問の仕方も含めて親切な回答ありがとうございました。 今回の回答読ませていただいて正規表現の奥の深さの一部を 知る思いです。 これに懲りず今後も宜しくお願いいたします。 大変ありがとうございました。