• ベストアンサー

正規表現を利用して複数の半角空白を1つに置換しようとしています。

正規表現を利用して複数の半角空白を1つに置換しようとしています。 但し、シングルクォートで囲まれている部分は置換の対象外としたいのですが、どのようなパターンにすれば置換する事が出来るでしょうか。 先読み表現、後読み表現は利用出来る環境です。 どうか良い知恵をお貸し下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

VB.NET については知らないので的外れかも知れません。開始シングルクォートの前に 半角スペースが1つ以上あることが条件です。 s/ * ('[^']*'|[^ ])/ $1/g なお、Vim では次のように書く必要があるように思います。 %s/ * \('[^']*'\|[^ ]\)/ \1/g

katsu034jp
質問者

お礼

Vimで変換を行なったところ、正しく変換を行う事が出来ました。 ありがとうございました!

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

アポストロフィの内側とか外側とかを識別させるのは 無理なんじゃないでしょうか。空白以外の字は残す のでしょうし・・・ 言語が何か分からないんですが、アポストロフィで splitして、奇数番目のものについては複数の空白を 1個にする変換をかけ、偶数番目の項目はそのまま アポストロフィで再結合させるような手しか思い つきません。

katsu034jp
質問者

補足

やはり無理でしょうか。 具体的な言語はVisualStudio2005のVB.NETでの開発ですが、正規表現のパターンが分かれば良いと思い指定しませんでした。 MatchEvaluatorクラスを利用して、正規表現で抽出後に別途処理を行なってもOKなのですが、それでも私のスキルでは適切なパターンが表現出来ませんでした。 何卒、ご思案の程お願いいたします。

  • dezimac
  • ベストアンサー率56% (2365/4208)
回答No.2

s/?([^' ]?) +?([^']?)/?1 ?2/ 「'」か「 」以外で始まり「 」が一回以上繰り返し「'」以外で終わる のを検索して 始めの1文字と「 」と最後の1文字 で置換。

katsu034jp
質問者

補足

Vim 7.2で実行してみましたが、置換する事が出来ませんでした。 具体的には文字列「SELECT * FROM A WHERE AA = ' '」という文字列をVimのコマンドで「%s/?([^' ]?) +?([^']?)/?1 ?2/」と実行してみましたが、置換する事が出来ませんでした。 お答え頂いきありがとうございます。 引き続きお願い致します。

noname#111181
noname#111181
回答No.1

以下のような感じでしょうか。 s/[^'][ ]+[^']/ /

katsu034jp
質問者

補足

ご教示頂いた文字列では、シングルクォート以外の複数空白を1つに出来ませんでした。 私の質問が言葉足らずで申し訳ございません。 シングルクォートで囲まれていない、連続した半角空白を抽出する正規表現のパターンをお教え頂けないでしょうか。

関連するQ&A