• ベストアンサー

正規表現を利用して複数の半角空白を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

  • 秀丸を利用して、空白から空白の間で、正規表現を使う

    秀丸を利用して、空白から空白の間で、正規表現を使いたいのですが、 やりかたが分かりません。 ^半角スペース.+?半角スペース と思ったのですが、違いました。 正規表現を使いたいところは、 こんな感じになってます。 謎の空白 半角空白 文字列 謎の空白 半角空白 (行頭からここの文字列の前だけ切りたい)  謎の空白 半角空白 文字列 謎の空白 半角空白 (行頭からここの文字列の前だけ切りたい)          : てっきり、全角空白かと思い、記号表示させてみたけど、違いました。 次に、タブかな、と思い、記号表示させてみたけど、違いました。 空白って、全角と半角とタブしか思いつかないのですが、 それ以外に何かあるのでしょうか? また、それは、正規表現で、どう扱うのでしょうか?

  • 秀丸エディタの正規表現

    秀丸エディタの正規表現 これから述べる置換処理について教えてください。 条件を表現します。 まず半角空白文字を _ このように全角アンダースコアであらわします。 そしてマッチさせたいSTRINGは _ このように半角空白文字がそれ以外の文字に前後をはさまれている状態ではなくて、 、 __ このように半角空白文字二個もしくは二個以上続いたものが半角空白文字以外に挟まれているパターンです。 。 ちなみに置換後の文字列は __ ですつまり空白半角文字列二個です。 よってこの質問は次のようにも言い換えられます。 。 検索文字列 半角空白文字二個以上 を置換後文字列 半角空白文字二個に置き換える。もしくは、半角空白文字三個以上を 置換後文字列 半角空白文字二個に置き換える。 というのが質問です。おねがいします。 すみませんつけたしです。上記を実現する正規表現を教えてください。

  • 正規表現:囲われた文字列の置換

    シングルクオーテーションで囲われた文字列のシングルクオーテーションの前に文字を追加するように、正規表現を用いて置換しようと考えています。 全角文字は[^\x01-\x7E]で検索できるのはわかったのですが、シングルクオーテーションで囲われて、全角文字を含む場合という表現ができません。 下記のような、文字列を対象としています。置換をするのは、全角文字を含む文字列のみです。  全角文字のみ  半角文字のみ  全角半角文字両方 下記ののように置換したいです。 置換前: '全角文字や半角文字','testです','test'.'テスト'.'てすとtest','123' 置換後: A'全角文字や半角文字',A'testです','test'.A'テスト'.A'てすとtest','123' よろしくお願いします。

  • 正規表現で少し複雑な置換がしたい

    Javaというよりも、正規表現について質問です。 (一応、言語はJavaで、String#replaceAllを使います) 以下のルールで与えられた文字列の置換を行う正規表現を考えていますが、なかなかうまくいきません。 1.正規表現で \w+:: にマッチする文字列を削除する。 2.ただし、'' (シングルクォーテーション)で囲われている文字列は   1.の対象としない 3.ただし、\' (シングルクォーテーションの前に\があった場合は)   シングルクォーテーションと認識しない。 例: 置換前  A * B \'' CCC.DD::EEE' FFF.GGG::HH ' III' 置換後  A * B \'' CCC.DD::EEE' FFF.HH 'III' 色々試してみたのですが、どうしてもうまくいきません。 正規表現が得意な方、教えていただけますでしょうか・・?

    • ベストアンサー
    • Java
  • 正規表現でSQLのエスケープ

    C# 2.0 & SQLServer2000 でプログラムを作成しています。 通常のADOではなく、サードパーティーのDBコンポーネントを使ってDB周りはやっているのですが、その際に SQL 文は自分でエスケープしてやる必要があることに後から気付き、正規表現でSQL文をまとめてエスケープすることはできないかと考えています。 正規表現を使って実現したい事は以下です。 ・文字列中の ' (シングルクォート)を '' (シングルクォート2つ)に置換 ・ただし、 where field = 'xxxx' のように文字列を間に入れている場合の ' は置換しない WEBなどで調べても見つかりませんでした。どなたか正規表現に強い方、教えてください。

  • 正規表現を用いての置換。

    お世話になっております。 VBScriptで、正規表現を用いての置換がうまくいかないので、ご教授ください。 半角数字に挟まれている、全角の「ー」(長音符)を、半角ハイフンに変換したいと 思っています。 先日ご教授いただいて、以下のように作りました。 --- Set ObjRegExp = Server.CreateObject("VBScript.RegExp") ObjRegExp.Pattern = "([0-9])ー([0-9])" StrHalf = ObjRegExp.Replace(StrHalf, "$1-$2") --- しかし、たとえば 1ー2であれば、1-2となるのですが、 1ー2ー3の時に、1-2ー3(後方が長音符のまま)となってしまいます。 修正すべき点をご教授いただけないでしょうか。

  • 正規表現で置換

    正規表現の初心者です。 テキストエディタを使って、「@:」で始まる以外の行の先頭に「//」を挿入してコメントアウトしたいのですが、正規表現がうまく書けません。 検索対象: ^[^(@:)] 置換文字列: // でいいのかなと思ったのですが、[]の中ではグルーピング用の()も文字として認識されてしまうのですね。 どのように書いたら正しく置換されるでしょうか。 どうかご教示ください。

  • 正規表現と置換を使って書き換えたい

    HTMLのソースなどで、 …省略…width=300 border=10 cellspacing=0 cellpadding=0> …省略…width="300" border="10" cellspacing="0" cellpadding="0"> (スペースの都合で改行しています) と属性値をダブルクォートでくくるように書き換えたいのですが、検索文字列、置換文字列を正規表現を使ってどのように記述すればよいのでしょうか? よろしくお願いします。

  • 正規表現で置換したい

    ブログのシステムを変更して、 記事中にある内部リンクの書き換えが必要となりました。 現在、記事中に post-001.html post-005.html  ・  ・  ・ post-853.html という文字列があります。 数字は飛び飛びでそれぞれ異なり500個ほどあります。 WordPressのプラグインの「Search Regex」を使って置換をしたいのですが、 正規表現で置換して、 ハイフンをアンダーバーに置換し、お尻の「.html」は削除して post_001 post_005  ・  ・  ・ post_853 としたいのですが、正規表現で置換する場合、 どのようにすればいいのでしょうか。 「post-」を ( ) でくくればいいのでしょうか。 「.html」削除するにはどうすればいいのでしょうか。 Search Regex に Search pattern(置換前の文字列)と Replace pattern (置換後も文字列)を入力する欄があります。 上のような文字列を置換したい場合は、 それぞれどのような記号を入力すればよいのでしょうか。 アドバイスをよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現で一括置換

    現在、数多くの長文データを、テキストエディタの置換機能で一括置換しています。 jeditX(または秀丸エディタ)の正規表現をもちいた複数一括置換について質問させていただきます。 私は正規表現やPC言語の初心者です。どうぞよろしくお願いいたします。 かなり困り果てております。どうぞ、正規表現にくわしいかた、よろしくお願いします。 一二三『一二三にそれぞれ♪マーク』 という文章に対して 一♪二♪三♪ という一括置換をすることには成功しました。 こう書いています。 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪ これでぶじ、以下のように一括置換できました。 一♪二♪三♪ 現実には傍点や圏点をふっているんですが、判りやすく♪マークにしています。 この調子で長い文章も変換できていて満足していたのですが…… しかし代入文字が10個以上になったとたんに、まったく動きません。 ■置換したい文章 一二三四五六七八九十『一二三四五六七八九十にそれぞれ♪マーク』 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪\4♪\5♪\6♪\7♪\8♪\9♪\10♪ こうやると、置換後の文章は以下のようになってしまいます。 一♪二♪三♪四♪五♪六♪七♪八♪九♪一0♪ 10個目以降の数字が、正しく機能してくれません。 \10  という正規表現の書き方は 「一番目の値を参照して、それから数字の0を記入しなさい」 という意味になってしまうようです。 わたしは十番目の値を代入してほしいだけなんです。 \1 や \2 や \3 といった代入文字のように \10 や \11 を機能させる、正しい表記をご教授ください。よろしくお願いいたします。 ちなみに以下のように書いてもダメでした……。 \1\0 グーグルで1日中検索しても判りませんでした。jeditXの複数一括置換でこれをなんとかしたいのです。ご存じの方、どうぞ教えてください。よろしくおねがいします! 秀丸エディタをご利用で、正規表現にくわしい方も、ぜひヒントを出していただければと思います。