【VBScript.RegExp 正規表現を使用した置き換え】

VBA を使用してある文章を処理しているのですが、以下のような置き換えができずに困っています。Pattern に何を入力すればよいか教えてください。

★やりたいこと。
<tag1 attr="abc">私は、はてなで<tag2>質問</tag2>をします。</tag1>
という文章があった場合に、タグ以外のテキストをすべて"hoge"に変えたい。
結果は以下のようになります。
<tag1 attr="abc">hoge<tag2>hoge</tag2>hoge</tag1>

★コード
'対象となるテキスト
Dim target As String
target = "<tag1 attr="abc">私は、はてなで<tag2>質問</tag2>をします。</tag1>"

'VBScript.RegExp
Dim RE
Set RE = CreateObject("VBScript.RegExp")
Dim strPattern As String

'結果
Dim ret As String

strPattern = "" 'ココ!

With RE
.Pattern = strPattern
.Ignorecase = False
.Global = True
ret = .Replace(target, "hoge")
End With

パターンにはどのように入力すればよいでしょうか?
お知恵をお貸し下さい。

よろしくお願いします。
※タグのカッコには念のため全角を使用しましたが、実際は半角です。

回答の条件
  • 1人2回まで
  • 登録:2008/01/08 16:39:29
  • 終了:2008/01/14 18:07:17

ベストアンサー

id:ku__ra__ge No.3

ku__ra__ge回答回数118ベストアンサー獲得回数402008/01/09 13:21:56

ポイント30pt

以下の正規表現で前後にタグがないパターンにも対応できると思います。

肯定先読み(「(?=……)」の個所)を利用しています。

.Pattern = "(>|^)[^<]+(?=<|$)"
ret = .Replace(target, "$1hoge")

正規表現としては肯定後読みというものも存在し、それを利用すれば

もっと綺麗に書けるのですが残念ながらVBScript.RegExpオブジェクトでは

肯定後読みは実装されていないようです。

その他の回答(2件)

id:ween No.1

ween回答回数78ベストアンサー獲得回数72008/01/08 17:06:26

ポイント30pt

改行がなければこれでいけると思います。

strPattern = ">.*?<"
ret = .Replace(target, ">hoge<")

改行がある場合

strPattern = ">.*?<|>.*?/n<"
ret = .Replace(target, ">hoge<")
id:Nigitama

ありがとうございます!

.Replace(target, ">hoge<")

発想の転換ですねー。私は逆のことばっかり考えてました。

で、結果なんですが、失敗でした。(笑

いや、weenさんがいけないわけじゃないですが、

文頭or文末にタグがない場合など (以下) ではうまくいきませんでいた。

"私は<tag1>はてなで</tag1>質問します。"

"私は<tag1>hoge</tag1>質問します。"

となってしまいました。

パターンをちょっと変えて行頭と行末も守備範囲に入れましたが、

置き換える">hoge<"が曲者で、

">hoge<tag1>hoge</tag1>hoge<"

となってしまいました。

1度の置き換えで、行頭と行末に対応するのは私の頭ではできなかったので、4回の処理で対応してみました。

以下です。

strPattern = "^[^<]+$"

'行頭から < 以外の任意の文字が 1 個以上で、文末まで続く

'これはタグが 1 個もない場合

(処理)

strPattern = "^[^<]+<"

'行頭から < 以外の任意の文字が 1 個以上で、< で終わる

(処理)

strPattern = ">[^<]+$"

'> で始まり、< 以外の任意の文字が 1 個以上で、行末で終わる

(処理)

strPattern = ">[^<]+<"

'> で始まり、< 以外の文字が 1 個以上で、<で終わる

(処理)


というコードにしたらできました。

ちょっとやぼったいですね・・・(恥

もしよければ、このコードをスマートにする方法か、

対応しきれない状況などありそうでしたら、続けて回答いただけないでしょうか?

※対象テキストに改行はありません。

2008/01/08 18:02:19
id:airplant No.2

airplant回答回数220ベストアンサー獲得回数492008/01/09 03:25:08

ポイント30pt

一度でやるのには無理がありそうです。

次のように2度で全部のケースに対応できました。

' >で始まる1文字以上で<か行末までの部分
strPattern = ">.+?(?=<|$)"
' 肯定先読みなので、<はマッチ扱いにならない
ret = .Replace(target, ">hoge")

' 引き続き、行頭から<が出てくるまでの部分
strPattern = "^[^<]+"
ret = .Replace(ret, "hoge")

なお、2度目のretはタイプミスではなく、再スキャンで1回目にて変換できなかった部分を変換しています。

id:ku__ra__ge No.3

ku__ra__ge回答回数118ベストアンサー獲得回数402008/01/09 13:21:56ここでベストアンサー

ポイント30pt

以下の正規表現で前後にタグがないパターンにも対応できると思います。

肯定先読み(「(?=……)」の個所)を利用しています。

.Pattern = "(>|^)[^<]+(?=<|$)"
ret = .Replace(target, "$1hoge")

正規表現としては肯定後読みというものも存在し、それを利用すれば

もっと綺麗に書けるのですが残念ながらVBScript.RegExpオブジェクトでは

肯定後読みは実装されていないようです。

  • id:ween
    そこまで込み入っているとは思ってませんで、ちと浅はかな回答だったかも。
    申し訳ないです。
    私のレベルではスマートにする事は出来ませんので、他の方の回答を待ちましょう。
  • id:airplant
    4回を2回で済ませられそうなので、回答しました。
    回答オープンされていないということは、お忙しいのかな?
  • id:Nigitama
    ありがとうございます。
    自分も2回パターンを思いついたところで、
    仕事ががっつりきてしまい放置してしまいました。

    id:airplantさんのこのコードでいこうと思います。
    丁寧な色分けもありがとうございます!
  • id:airplant
    解決されて何よりでした。
    >丁寧な色分けもありがとうございます!
    色分けは、機械が自動でやってくれますので、覚えておくと楽です。
    >|vb|
    ' >で始まる1文字以上で<か行末までの部分
    strPattern = ">.+?(?=<|$)"
      :
    ||<
    のような感じにて。
    vbのところには、多数の言語がサポートされているようです。
    詳細ははてなのヘルプにて。
    http://hatenadiary.g.hatena.ne.jp/keyword/%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e8%89%b2%e4%bb%98%e3%81%91%e3%81%97%e3%81%a6%e8%a8%98%e8%bf%b0%e3%81%99%e3%82%8b%ef%bc%88%e3%82%b7%e3%83%b3%e3%82%bf%e3%83%83%e3%82%af%e3%82%b9%e3%83%bb%e3%83%8f%e3%82%a4%e3%83%a9%e3%82%a4%e3%83%88%ef%bc%89
  • id:ku__ra__ge
    もう開かれそうにないのでコメントにて。

    strPattern = "(>|^)[^<]+(?=<|$)"
    ret = .Replace(target, "$1hoge")
    とすると、1回の置換でいけます。
  • id:Nigitama
    ろくに返信できずにすいません。
    ベストアンサーとしているかを贈らせていただきました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません