- ベストアンサー
正規表現を利用して複数の半角空白を1つに置換しようとしています。
正規表現を利用して複数の半角空白を1つに置換しようとしています。 但し、シングルクォートで囲まれている部分は置換の対象外としたいのですが、どのようなパターンにすれば置換する事が出来るでしょうか。 先読み表現、後読み表現は利用出来る環境です。 どうか良い知恵をお貸し下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
VB.NET については知らないので的外れかも知れません。開始シングルクォートの前に 半角スペースが1つ以上あることが条件です。 s/ * ('[^']*'|[^ ])/ $1/g なお、Vim では次のように書く必要があるように思います。 %s/ * \('[^']*'\|[^ ]\)/ \1/g
その他の回答 (3)
- nda23
- ベストアンサー率54% (777/1415)
アポストロフィの内側とか外側とかを識別させるのは 無理なんじゃないでしょうか。空白以外の字は残す のでしょうし・・・ 言語が何か分からないんですが、アポストロフィで splitして、奇数番目のものについては複数の空白を 1個にする変換をかけ、偶数番目の項目はそのまま アポストロフィで再結合させるような手しか思い つきません。
補足
やはり無理でしょうか。 具体的な言語はVisualStudio2005のVB.NETでの開発ですが、正規表現のパターンが分かれば良いと思い指定しませんでした。 MatchEvaluatorクラスを利用して、正規表現で抽出後に別途処理を行なってもOKなのですが、それでも私のスキルでは適切なパターンが表現出来ませんでした。 何卒、ご思案の程お願いいたします。
- dezimac
- ベストアンサー率56% (2365/4208)
s/?([^' ]?) +?([^']?)/?1 ?2/ 「'」か「 」以外で始まり「 」が一回以上繰り返し「'」以外で終わる のを検索して 始めの1文字と「 」と最後の1文字 で置換。
補足
Vim 7.2で実行してみましたが、置換する事が出来ませんでした。 具体的には文字列「SELECT * FROM A WHERE AA = ' '」という文字列をVimのコマンドで「%s/?([^' ]?) +?([^']?)/?1 ?2/」と実行してみましたが、置換する事が出来ませんでした。 お答え頂いきありがとうございます。 引き続きお願い致します。
以下のような感じでしょうか。 s/[^'][ ]+[^']/ /
補足
ご教示頂いた文字列では、シングルクォート以外の複数空白を1つに出来ませんでした。 私の質問が言葉足らずで申し訳ございません。 シングルクォートで囲まれていない、連続した半角空白を抽出する正規表現のパターンをお教え頂けないでしょうか。
お礼
Vimで変換を行なったところ、正しく変換を行う事が出来ました。 ありがとうございました!