• ベストアンサー

「?」の入った文字列置換を、RegEx.Replaceで行いたい

WSHを使い、あるhtmファイルの中にある特定の文字列を、RegEx.Replaceを使って置換しようとしています。通常の文字列置換についてはなんとか成功しているのですが、下記のケースで壁に当たっています。前に進める為にはどうしたらよいか、ヒントをご存知の方がいれば大変有り難く思います。 今回作業の特徴としては 1)置換前の文字列の中にメタキャラ「?」が含まれており、 2)置換前の文字列は、DBから読み込んできた文字列である の2点です。(ちなみに1だけでは成功しているのですが、1と2が組み合わさると上手くいきません) 具体的には、下記のサンプルで置換前の文字列を url_before = "test.asp\?param=999" (?についてはエスケープ文字付与) のように明示的に書いてやると置換に成功しました。ところがDBから取得してきた文字列で置換をしようとしても失敗となります。 たとえばrs.fields("item")の中身が"test.asp?param=999"だったとして、先ほどの箇所を url_before = replace(rs.fields("item"), "?", "\?") とすると、置換されないのです。 '----- サンプル ----- Set fso = CreateObject("Scripting.FileSystemObject") Set regEx = New RegExp Set inFile = fso.OpenTextFile("c:\hoge\test1.htm") Set outFile = fso.CreateTextFile("c:\hoge\test1_wk.htm") ◆動くケース:url_before = "test.asp\?param=999" ◆動かないケース:url_before = replace(rs.fields("item"), "?", "\?") url_after = "test_999.htm" regEx.pattern = url_before repStr = url_after Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • kumar
  • お礼率21% (19/87)

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.7

とりあえずテストコードを書いてみたけど、特に問題ないみたいです。 なのでやっぱり質問とか補足で書かれてないところで間違えてる可能性が高いかと。 コード: Function iif(c,t,f) If c Then iif = t Else iif = f End If End Function Set rs = WSCript.CreateObject( "ADODB.Recordset" ) rs.Open "T1", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb;" url_before = Replace( rs.Fields( "item" ).Value, "?", "\?" ) url_after = rs.Fields( "replacer" ).Value rs.Close url_before_OK = "test.asp\?param=999" WScript.Echo "1)", url_before, ":", iif( url_before = url_before_OK, "OK", "NG" ) Set re = new RegExp re.Pattern = url_before s1 = "/g/test.asp?param=999" a1 = "/g/test_999.htm" r1 = re.Replace( s1, url_after ) WScript.Echo "2)", s1, "->", r1, ":", iif( r1 = a1, "OK", "NG" ) データ db1.mdb テーブル T1の内容(左辺は列名): item=test.asp?param=999, replacer=test_999.htm 実行結果: 1) test.asp\?param=999 : OK 2) /g/test.asp?param=999 -> /g/test_999.htm : OK

その他の回答 (7)

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

#6>"等しい"と出ます repLine=Replace(tempLine, "test.asp?param=999", "test_999.htm") または、 >◆動くケース:url_before = "test.asp\?param=999" で直接指定した場合は >repLine = regEx.Replace(tempLine, repStr) が機能するが rs.fields("item") を元にするものはうまく機能しないが "test.asp?param=999"とrs.fields("item")じたいは等しいと思われる 上記から考えられるのは、 >repLine = regEx.Replace(tempLine, repStr) の行までにrs.fields("item") (または元にした部分)が変質している ということですね。 データベースから取り出すタイミングと処理する時のタイミングがおかしいんじゃないですかね。 私も 質問とか補足で書かれてないところで間違えてる可能性が高い と思います。

kumar
質問者

補足

皆さん、親切なフォローありがとうございます。お陰様でなんとか変換することができるようになりました。深謝いたします。

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

#5>結果は(T_T)です。 repLine=Replace(tempLine, "test.asp?param=999", "test_999.htm") は、とりあえずうまくいくんですよね? If rs.fields("item") = "test.asp?param=999" Then MsgBox "等しい" Else MsgBox "等しくない" End If を試してみたらどうなりますか?

kumar
質問者

補足

BLUEPIXYさん、いつもありがとうございます。 ご指摘の方法試してみましたところ、"等しい"と出ます。取り急ぎご連絡まで。

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

#4補足> すいません、ずっと勘違いしていたようです。 なんていうか、こういうような場合には、 わざわざRegEx.Replace を使う必要はないように思います。 例えば url_before = "test.asp?param=999" url_after = "test_999.htm" repLine=Replace(tempLine, url_before, url_after) のようにすればいいだけのように思えます。 それはそれとして、 rs.fields("item") を用いたものが置換されないのは、 WScript.Echo で表示させて、見た目は一緒でも 一致しない何かが含まれているんじゃないでしょうか 一度ファイルにでも出力して、16進ダンプ表示でもしてみたらどうでしょうか?

kumar
質問者

補足

BLUEPIXYさん、いつもありがとうございます。 repLine=Replace(tempLine, url_before, url_after)でやってみました。 url_before = "test.asp?param=999"のケースとurl_before = "test.asp\?param=999"の両方のケースを試してみましたが、結果は(T_T)です。 おそらくBLUEPIXYさんが予測されている通り、見た目には同じでも別キャラクタなのかもしれません。

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

>そのような訳で変換する文字列は、一対一対応でねらいを定めてやるのが確実かと思います。 補足で言わんとされることが良く判りませんが、 回答側には、どのようなパターンがあって、どのようなことが求められいるのかはっきりとはわかりません。 望むようにされればいいと思います。

kumar
質問者

補足

BLUEPIXYさん、言葉足らずで大変失礼いたしました。 正確に書きます。 下記のいずれも、url_after = "test_999.htm"とします。 <ケース1> regEx.pattern = "test.asp\?param=999" repStr = url_after とすれば置換されて正常終了しました。ところが、 <ケース2> url_before = rs.fields("item") url_before = replace(url_before, "?", "\?") wscript.echo url_before <---(この時点でこの中身は「test.asp\?param=999」です) regEx.pattern = url_before repStr = url_after のように、DBからレコードセットとして取ってきた値を入れると、置換されなくて困っております。 実際にはDBから取得したURL名をそれぞれ別の名前に自動で置き換えしたいと計画しておりますため、ケース2のやり方で前に進められるのが望ましいという背景があります。 なおBLUEPIXYさんがサジェストして下さった方法も大変興味深いのですが、実際にやってみますと、対象ページの中で置換しなくても良い箇所まで置換されてしまった(regEx.pattern = "\..*="ですから、同じ表現の箇所は全て対象になってしまいますね)次第で、今回は上手くいかなかったのです。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

> url_before = replace(rs.fields("item"), "?", "??") 直後に、url_beforeをWScript.Echoで出力させてみては。 あと期待する値と比較してみるとか。 もしかして、Fieldオブジェクトの既定プロパティが違ってるとか、予期せぬ形式に文字列書式化されてるかも。 すでにそれくらいのデバッグはやられてるかもしれませんが。

kumar
質問者

補足

ありがとうございます。おっしゃる通りで、予期せぬ形式に文字列が置き換わっているかもしれないので、wscript.echoさせてみました。 url_before = replace(rs.fields("item"), "?", "??") の場合は置換対象文字列が test.asp??param=999 となっていました。これを実行させたのですが、置換されていませんでした。 次に url_before = replace(rs.fields("item"), "?", "\?") とした場合は、wscript.echoすると test.asp\?param=999 と出てきますが、こちらでやってもダメです。 明示的に url_before = "test.asp\?param=999" とすれば文字列置換されるのに、どうしてなのか頭を悩ませております。

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

>test.asp?param=999→test_999.htm >と一括置換することです。 そういうこともあるかな・・とはちょっと思いましたが… またはずしてたらすみません ---------------------------------------------------------------- 'test.asp?param=999→test_999.htm Set regEx = New RegExp url_before = "test.asp?param=999" regEx.pattern = "\..*=" '(1)ピリオドから=までを無条件にアンダーバーに置き換える url_after = regEx.replace(url_before,"_") & ".htm" WScript.Echo url_after '(2)ファイル名と数字をマッチさせて取り出す regEx.pattern ="(^.*?)\.asp\?param=(\d+)" Set Matches = regEx.Execute(url_before) fileName = Matches(0).SubMatches(0) No = Matches(0).SubMatches(1) url_after = fileName & "_" & No & ".htm" WScript.Echo url_after

kumar
質問者

補足

情報ありがとうございます。特に(1)の方法があるのですね。とても参考になります。 小さなページであればこの方法で前に進めると思います。 ただこの方法ではページの中に他のリンクがあると、それも一緒に変換されてしまうことになります。 そのような訳で変換する文字列は、一対一対応でねらいを定めてやるのが確実かと思います。

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

test.asp?param=999→test.asp\?param=999 という処理ということでよろしいでしょうか? Set regEx = New RegExp url_before = "test.asp?param=999" regEx.pattern = "\?" url_after = regEx.replace(url_before,"\?") WScript.Echo url_after というような感じになります。

kumar
質問者

補足

BLUEPIXYさん、早速のメッセージありがとうございます。 >test.asp?param=999→test.asp\?param=999という処理ということでよろしいでしょうか? 残念ながらそうではありません。今回の目標は、 test.asp?param=999→test_999.htm と一括置換することです。 さらに置換候補となる文字列をDBから取ってきて処理を回しますから、url_beforeにはレコードセットに取ってきた値となります。 取り急ぎですが、説明補足させていただきます。

関連するQ&A

  • 改行を含んだ文字列を正規表現で置換するには?

    正規表現で、改行を含んだ文字列を置換しようと思っています。 例えば下の「infile.txt」にある aaa bbb という(2行にわたる)文字列を zzz という文字列に変換させたい訳です。 試しに「test.vbs」のようなコードを書いてみましたが、これでは上手く行きませんでした。 上手く変換されるようにするには、どうしたら良いでしょうか? ----------------------------------------------------- ○「test.vbs」の内容 Set fso = CreateObject("Scripting.FileSystemObject") Set inFile = fso.OpenTextFile("C:\infile.txt") Set outFile = fso.CreateTextFile("C:\outfile.txt") Set regEx = New RegExp regEx.pattern = "aaa\nbbb" repStr = "zzz" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close ----------------------------------------------------- ○「C:\infile.txt」の内容 aaa bbb ccc

  • 正規表現(regex)でパラメータ付き文字列を置換したい

    あるページ内に次のようなjavascriptがあるとします。 javascript:test(1); javascript:test(2); javascript:test(3); javascript:test(4); これらを次のように一度に置換したいわけです。 test_1.txt test_2.txt test_3.txt test_4.txt 正規表現で置換するスクリプトを作っていますが、3行目の書き方をどうしていいかで困っています。 アドバイスお願いいたします。 ---- スクリプトサンプル ------- Set regEx = New RegExp regEx.pattern = "javascript:test\(.*\);" repStr = 「この記述方法がわからない」 Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop

  • テキストファイル中の文字列を書き換えるスクリプトを書きたい

    テキストファイルの文字列を書き換えるスクリプトを考えています。 今、次のところまで出来るようになりました。本当は「こんにちは」の文字列を全て「HELLO」に置換したいのです。現在は一行の中で最初の「こんにちは」は置換されますが、2番目以降が置換されません。同じ行中の2番目以降も置換するには、どうしたら良いでしょうか? <置換前ファイル:sample.txtの中身> こんにちはこんにちはこんにちはこんにちは こんにちは こんにちは <置換前ファイル:sample.txtの中身> HELLOこんにちはこんにちはこんにちは HELLO HELLO <置換スクリプト> Set fso = CreateObject("Scripting.FileSystemObject") Set regEx = New RegExp Set inFile = fso.OpenTextFile("C:\static\sample.txt") Set outFile = fso.CreateTextFile("C:\static\sample1.txt") regEx.Pattern = "こんにちは" repStr = "HELLO" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • ファイルの変換で文字化けを回避したい

    ファイル中の文字列を一部書き換える処理をしています。regEx.replaceを使って書き換えたところ、日本語が下記のように文字化けしてしまいます。 これを回避するためにどうしたら良いでしょうか? ○変換前:test1.txt <description>東京都</description> ○変換結果:test2.txt(文字化け) <description>譚ア莠ャ驛ス</description> ○スクリプト Set fso = CreateObject("Scripting.FileSystemObject") Set inFile = fso.OpenTextFile("c:\test1.txt") Set outFile = fso.CreateTextFile("c:\test2.txt") Set regEx = New RegExp regEx.pattern = "テスト" repStr = "てすと" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • VBA REPLACE関数 文字列の置換

    ACCESS VBA REPLACE関数についての質問です。 FAQテーブル(answer列) HENKANテーブル(moji列,tag列)を用意。__すべてメモ型 HENKANテーブルのmoji列の値が、FAQテーブルのanswer列の値にある場合に、HENKANテーブルのtag列の値と入れ替える というコードを現在かいております。 例) Private Sub a_Click() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = CurrentDb.OpenRecordset("SELECT ANSWER FROM FAQ", dbOpenDynaset) Set rs2 = CurrentDb.OpenRecordset("SELECT moji,tag FROM HENKAN", dbOpenDynaset) Do Until rs2.EOF Do Until rs1.EOF rs1.Edit rs1!ANSWER = Replace(rs1!ANSWER, "rs2moji","rs2!tag") rs1.Update rs1.MoveNext Loop rs1.MoveFirst rs2.MoveNext Loop rs1.Close Set rs1 = Nothing rs2.Close Set rs2 = Nothing End Sub 上記コードを一先ずテスト用に作成したのですが、うまく置換されません。 REPLACE関数部分の表記をどのようにしたらよろしいでしょうか? ご面倒おかけしますが、ご教示お願いいたします。

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

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

  • 文字列の置換

    電話番号のデータを文字列分、'#'で置換したいのですが、 update test set tel_no = replace(tel_no,tel_no,'#'); では、'#'一文字になってしまいます。 電話番号が10桁の場合、##########と置換するための OracleのSQLを教えてください。

  • 文字列の置換について

    こんにちは、kanpoと申します。 今回文字列の置換についての質問をさせていただきたいと思います。 やりたいことは以下のとおりです。 たとえば、あるStringデータに”あかさた#1728なはま#7586やらわ”などという 文字列が入ってるとします。 この文字列のなかから"#1728"と"#7586"を検索しそれぞれを #1728 → test #7586 → test2 と変換し最終的にもとのStringデータを ”あかさたtestなはまtest2やらわ”としたいのです。 説明が長くなってしまい申し訳ありませんがよろしくご教授ください。 環境は下記のとおりです。 RedhatLinux6.2J apache-1.3.12-0jp1.i386 php-3.0.15_i18n_ja-0vl2.i386

    • ベストアンサー
    • PHP
  • タグにはさまれている文字以外を置換したい

    あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。 そのマルチバイト文字列には、htmlの<a>タグが混じっています。(混じっていない場合もあります。) 置換したいのは、<a>タグで囲まれている文字以外の文字なのですが、正規表現としてどのようなパターンにすれば出来るのか悩んでおります。 ------------------------------------------------- //置換前のマルチバイト文字列 "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" //検索・置換対象となる文字列 "コーヒー" //置換を行う文字列 "紅茶" //置換後のマルチバイト文字列 "朝一番の紅茶は<a href="index.html">3時のコーヒーや</a>食後の紅茶より旨い" ------------------------------------------------- ↓こちらを参考にしてみたのですが、ちょっとやりたいことと違うみたいでうまくいきませんでした。 http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside ================================================= $string = "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" $pattern = '/((?:\G|>)[^<]*?)コーヒー/'; $result = mb_ereg_replace($pattern, '\1紅茶', $string); echo $result; ================================================= 是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • Replace関数 大文字小文字を区別したい

    エクセルVBAについて質問いたします。 Sub test23() Dim 文字列 As String 文字列 = "Aa" Debug.Print Replace(文字列, "A", "b") End Sub を実行すると戻り値は、bbなのですが、大文字小文字を認識して置換する方法はありますか? 上記の例で例えるのなら、「A」なら「B」に置換したいので 「a」は、「A」ではないので、置換させたくないのです。