プロが教えるわが家の防犯対策術!

正規表現について質問です。

テキストファイル内の文字列に対して、URL以外の「&」を「&」に置換したいのですが、
普通に置換してしまうと、URL内の「&」も全角になってしまうため、
正規表現で回避しようと考えています。

この場合、正規表現はどのように記述すればよいか、教えていただけると大変助かります。

----------------------------------------------------------------------
(成功例)
ガチャピン&ムック
http://hogehoge.jp/index.html?k=2011&id=0414

↓↓↓↓↓↓

ガチャピン&ムック
http://hogehoge.jp/index.html?k=2011&id=0414

----------------------------------------------------------------------


また、正規表現を使わなくてもできるなど、別の提案もOKです。
質問に不備があれば、その旨ご指摘お願いいたします。

正規表現勉強中のため、何卒よろしくお願いいたします。

A 回答 (2件)

<回答>


自分も、これを正規表現とエディタの通常置換だけで綺麗に解決する方法は思い浮かびませんでした。
エディタのマクロを使うか、スクリプト言語が使えればそれほど難しい話では無いと思います。

例えばですが、先読み否定を利用してこんな正規表現を作ってみます。
※想定処理系は鬼車で、実験環境は「サクラエディタ+bregonig.dll(v 2.00)」です。

^(?![  ⇒]?\w+?p://)(.*)&

こうするとキャプション1に&までの文字列が入るため、置換後ワードに

$1置換希望文字列

とでも書けば、一見動いたように見えます。

しかしこれだと、1行内に&が複数現れるケースで、最後の1つしか置換出来ない事になります。
.*を.*?としても、最初の1つになるだけでしょう
自分の知識量だとこの辺を解決できる記法が無いとまでは断言できませんので、出来る!というのがあれば是非知りたいなと思います。


※参考変換例は、行頭に#を付与しています。
## 元データ
#ガチャピン&ムック
#ガチャ&ピン&ムック
#http://hogehoge.jp/index.html?k=2011&id=0414
# http://hogehoge.jp/index.html?k=2011&id=0414
# http://hogehoge.jp/index.html?k=2011&id=0414
#⇒http://hogehoge.jp/index.html?k=2011&id=0414

## 置換後
#ガチャピン&ムック
#ガチャ&ピン&ムック
#http://hogehoge.jp/index.html?k=2011&id=0414
# http://hogehoge.jp/index.html?k=2011&id=0414
# http://hogehoge.jp/index.html?k=2011&id=0414
#⇒http://hogehoge.jp/index.html?k=2011&id=0414


<おまけ>
ただ、スクリプト言語を利用してもよいのであれば、いろんなアプローチで簡単に解決できます。
一番真面目な方法はURLが含まれることを専用ライブラリで解析する方法でしょうが、そこまでやらずにこの正規表現のようにURIっぽいものを弾いてみます。

https://ideone.com/N1Ubf

手法選択の中で一案として貰えればと思います。
Perlが代表格ですが、正規表現はスクリプト言語内で真価を発揮しますので。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
正規表現はスクリプト言語内が得意分野なのですね。お恥ずかしながら特性を理解していませんでした。
置換ルールが固定されているので無理にエディタだけでやろうとせず、専門家に依頼することにします。
とても助かりました。ありがとうございました。

お礼日時:2011/05/06 10:43

正直、あらゆるケースに対応したものを全自動でやろうとすると難しいと思います。



まず、その置換を行うソフトは何か?
テキストエディタの置換機能なのか、sedなのか、perlなのか、PHPなのか。
ソフトが違えば、正規表現自体に違いがあります。
半角→全角変換なら、「全角」が正しく使える(マルチバイト文字を「1文字」として扱える/マルチバイトの途中のバイトからはマッチしない)処理系が求められます。

次に入力がどんな形式になっているのか?その入力形式の特徴を使えば楽にできるかもしれません。
例えば、URLが 「必ず単独1行に改行無しでURLだけが書かれている」状態なら、そのような行を処理しない、という方法が使えます。が、他の内容と同じ行にあったり、途中で改行で切れることもあったり、だと面倒です。
例えば、URLは「半角英数記号」が基本であり、置換したい&の前後は必ず「全角」であるならば、後方参照を使って「前の全角&後の全角」→「前の全角&後の全角」のように置換できます。が、URLに全角を使っていたり、置換する&の前後が全角とは限らない、となると面倒です。

次に作業量がどれくらいなのか?
数ファイルだけなら、エディタの確認付き置換を使って、人間が判断するのが確実です。

この回答への補足

早速のご回答ありがとうございます。
以下、補足いたします。

⇒まず、その置換を行うソフトは何か?
└テキストエディタ、もしくは置換用のフリーソフト(Repl-Ace)を考えています。

⇒入力がどんな形式になっているのか?
└基本的には単独1行で書かれているのですが、たまにURLの前に全角スペースか半角スペース、もしくは「⇒」が入ります。

⇒作業量がどれくらいなのか?
└一度に作業するのは数ファイルなのですが、結構漏れがでたりしてしまうため、あらかじめ正規表現での置換を登録しておこうと考えています。
置換するところは他にもありますので、まとめてやりたいです。

度々すみませんが、何卒知恵を貸してくださいませ。

補足日時:2011/04/15 10:04
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2011/05/06 10:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!