• ベストアンサー

Excel : タグ付き正規表現による文字置換は可能?

アクティブセルの文字を、正規表現を利用して文字置換をしたいと考えています。 ただ、単純な文字置換ではなく、正規表現にマッチした文字列を記憶して、 置換後の文字列として呼び出して利用します。 秀丸エディタにあるような「タグ付き正規表現」を利用したいです。 Excelでも同じようなことは可能なのでしょうか? 一例として挙げますと、次のような文字置換です。 ●「?」の後に全角スペース以外の文字がある場合には、「?」の後に全角スペースを1つ入れる。 ●「?」の後に全角スペースが複数続く場合には、「?」の後の全角スペースを1つだけにする。 つまり、★を全角スペースとすると、次のようになります。 あいう?あいう   → あいう?★あいう あいう?★★あいう → あいう?★あいう さらに、一例を挙げますと、 ●「AさんはBさんの友達です」というような文章を、「BさんはAさんの友達です」にする。  つまり、AとBに相当する部分を入れ替える。 よろしくお願いいたします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 Excel の標準機能では正規表現は使えませんので、VBA で関数を作り、機能 拡張してやることになります。 【手 順】 1. [Alt]+[F11} で Visual Basic Editor を開く(以下VBE) 2. VBE 画面で [ツール]-[参照設定]クリック 3. [参照可能なライブラリファイル]で次の項目にチェックを入れる   ・Microosft VBScript Regular Expressions x.x   --> x.x の部分はお使いの PC により異なります(WinXP なら 5.5かな) 4. [OK]をクリック 5. [挿入]-[標準モジュール]クリック 6. 5. で開いた場所に下記のソースコードをコピペ 7. VBE を閉じる 8. Excel 画面で [Alt]+[F8] を押し、Sample マクロを実行 【補 足】   関数化してあるので、ワークシートでも使えます。例えば、   A1: AさんはBさんの友達です   B1: =RegReplace(A1, "(A)(.*)(B)", "$3$2$1")   で結果、BさんはAさんの友達です   なお、サンプルで示した正規表現については一例なので、適切に修正して   下さい。では。 '【ソースコード】 Option Explicit ' 正規表現による置換サンプル(VBAで使う場合) Sub Sample()   MsgBox RegReplace("あいう?あいう", "(?)", "$1★")   MsgBox RegReplace("あいう?★★あいう", "(?)(★{2,})", "$1★")   MsgBox RegReplace("AさんはBさんの友達です", "(A)(.*)(B)", "$3$2$1")    End Sub ' 正規表現による置換 Function RegReplace(ByRef strSource As String, _           ByRef strPattern, _           ByRef strReplacement As String) As String   '動作環境: IE5.0以上がインストールされていること   '参照設定: Microosft VBScript Regular Expressions x.x   Dim REG As REGEXP   Set REG = New REGEXP   With REG     .Pattern = strPattern     .IgnoreCase = False     .Global = True     RegReplace = .Replace(strSource, strReplacement)   End With   Set REG = Nothing End Function

booooob
質問者

お礼

まさに私が探していた機能がこれです! ありがとうございます。 早速使用してみましたが、便利なことこの上ないです。 これで文字置換を自由自在に行うことができます。 この機能について、さらに詳しく知りたいと思うのですが、ネットで検索しても分かりませんでした。 特に、正規表現にマッチした文字列を記憶して、 置換後の文字列として呼び出して利用する部分について説明しているサイトなどをご存知でしたら、お教えいただけませんでしょうか? よろしくお願いいたします。

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#5の#3は、#4の間違いでした。 たびたびすみません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#3>RegExp には、最短一致法(Perl でいう ".+?" のようなパターン)が使えませんが は、間違いでした。 使えます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

BregExp について知らないのですが、 #3で言われるように、 RegExp には、最短一致法(Perl でいう ".+?" のようなパターン)が使えませんが #3で挙げられている例は"最短一致法"による違いの例にはなっていません。 Function RegExpTest(patrn, strng) Dim regEx, Match, Matches Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = True regEx.Global = True Set Matches = regEx.Execute(strng) RegExpTest = Matches(0).Value End Function MsgBox(RegExpTest("[^\d]+", "12345abcde678")) のような例を試してみれば、パターン "[^\d]+" でabcde が取り出せることがわかると思います。

booooob
質問者

お礼

ご指摘ありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

最後の部分を忘れていましたので、付け足しておきます。 A2: ●「AさんはBさんの友達です」 =BREGEXPREPLACE(A2,"(A)([^B]+)(B)","$3$2$1","k",FALSE) 結果 ●「BさんはAさんの友達です」 補足: RegExp と BregExp の大きな違いは、最短一致法があるかどうかの違いだと思います。 12345abcde678 と文字列があるとき、 例えば、abcde と抜き出したい場合、 RegExp では、 パターン  "\d+([^\d]+)\d+" 抜き出し  "$1" BregExp Match パターン  "[^\d]+" ただ、あえて、Bgrep が良いということでもありませんが、Perl仕様で使いたい、という場合や、もう少し、豊富な正規表現を使う場合に、良いというだけです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

「タグ付き正規表現」というのは分かりませんが、正規表現パターンをお使いになるのなら、 http://www.hi-ho.ne.jp/babaq/index.html の 馬場さんのツール Basp21 を使えばよいのではありませんか? または、氏が前から出していた、個別のBgrepExp.dll のみを使って、 例えば、以下のようにして、後は、ユーザー定義関数でも、プロシージャでも応用すればよいと思います。 以下は、ほんの簡単なサンプルです。後は、ご自身で考えて作ってみてください。 Sample(単独でBgrepExe.dll を使用した場合) '------------------------------------------------- Public Declare Function Replace Lib "BRegExp" _    (szRegstr As String, szTarget As String) As String Public Declare Function Translate Lib "BRegExp" _    (szRegstr As String, szTarget As String, ret As String) As Long Public Function BregExpReplace(対象文字列 As String, _             パターン As String, _             置換値 As String, _             Optional グローバル As String = "", _             Optional スイッチ As Boolean = False) As String Dim myStr As String Dim myPattern As String Dim myRpl As String Dim opt As String Dim spt As String Dim flg As String Dim rtn As String Dim num As Long Dim a spt = "/" myStr = 対象文字列: myPattern = パターン: myRpl = 置換値: opt = グローバル flg = スイッチ If myStr = "" Then Exit Function If flg Then  num = Translate("tr/" & myPattern & spt & myRpl & spt, myStr, rtn)  BregExpReplace = rtn Else  a = "s/" & myPattern & spt & myRpl & spt & opt  BregExpReplace = Replace("s/" & myPattern & spt & myRpl & spt & opt, myStr) End If End Function '------------------------------------------------- [ ] を全角スペースとする '------------------------------------------------- A1: あいう?あいう   → あいう?[ ]あいう あいう?[ ][ ]あいう → あいう?[ ]あいう '------------------------------------------------- 全角スペースが入れてある。 =BREGEXPREPLACE(A1,"? *([^ ]+)","? $1","k",FALSE) 仕様書: '------------------------------------------------------------- BregExpReplace(対象文字列,パターン,置換値,グローバル,スイッチ) グローバル g グローバルにマッチ、つまり、すべてを探し出す i 大文字、小文字を区別しない k 日本語を処理する。日本語をシングル文字として処理しな い。 m 文字列を複数行として扱う。 スイッチ TRUE Translate (リストの置き換え) "tr/" FALSE Substitute (一般の置き換え) "s/" '----------------------------------------------------------

booooob
質問者

お礼

ご回答いただきありがとうございます。 Basp21については以前より知っていましたが、 使用方法がよく分からなかったため、使用するに至りませんでした。 今回Wendy02さんの使用例を拝見させていただき、 少し使えそうな気がしてきました。 ありがとうございました。