人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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

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

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


●質問者: にぎたま
●カテゴリ:コンピュータ
✍キーワード:ABC as hoge regexp SET
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ween
●30ポイント

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

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

改行がある場合

strPattern = ">.*?<|>.*?/n<"
ret = .Replace(target, ">hoge<")
◎質問者からの返答

ありがとうございます!

.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 個以上で、<で終わる

(処理)


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

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

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

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

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


2 ● airplant
●30ポイント

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

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

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

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

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


3 ● ku__ra__ge
●30ポイント ベストアンサー

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ