2016-11-04 8 views
-2
DIM re2:Set re2 = New RegExp 
WITH re2 
.Pattern = "dol amp" 
.IgnoreCase = True 
.Global = True 
MsgBox .Replace("put dol amp here","ok$&done") 
' Expected: put ok$&done here 
' Observed: put okdol ampdone here 
END WITH 

ドキュメントに基づいています。

"正規表現(正規表現)オブジェクト"
https://msdn.microsoft.com/en-us/library/yab2dx62(v=vs.84).aspx
https://msdn.microsoft.com/en-us/library/k9z80300(v=vs.84).aspx

"正規表現の概要(スクリプト)"
https://msdn.microsoft.com/en-us/library/6wzad2b2(v=vs.84).aspx

ここでのコントラストの成功:

DIM re2:Set re2 = New RegExp 
WITH re2 
.Pattern = "dol amp" 
.IgnoreCase = True 
.Global = True 
MsgBox .Replace("put dol amp here","ok$ &done") 
' Expected: put ok$ &done here 
' Observed: as expected 
END WITH 

答えて

-1

置換置換文字列では、$ &は、ドキュメントにはこれに言及していないにもかかわらず、特別な意味を持つ予約済みのシーケンスなので、

回避策:文書化されていない動作に返信いただきありがとうございました。$ &などから逃れることができます。未定義の動作に依存する

enter image description here

読者ない幸せな、ここを参照してくださいを:観測

DIM re2:Set re2 = New RegExp 
WITH re2 
.Pattern = "dol amp" 
.IgnoreCase = True 
.Global = True 
MsgBox .Replace("put dol amp here",Replace("ok$&done","$","$$")) 
' Expected: put ok$&done here 
' Observed: as expected 
END WITH 

https://stackoverflow.com/questions/40426225/re-the-issue-of-literal-in-regexp-replace-pattern-does-anyone-have-a-solutio

2

は非公開未定義と同じではありません。 VBScriptのドキュメントにはいくつかの点がありませんが(特に正規表現の詳細については特に注意してください)、その動作は予期しないものではありません。マイクロソフトでは、特殊文字を2倍にすることで文字をエスケープする長い歴史を持っています(VBScriptの最も顕著な例は文字列リテラルの二重引用符です)。 &は、多くの正規表現の実装での "全体一致"の共通のメタ文字です。

文書を求められた場合は、documentation for the .Net regular expression engineをご覧ください。機能セットは基本的にVBScriptエンジンで実装されている機能のスーパーセットです。

は要約する:置換パターンに

    $&
  • はマッチ全体への参照です。
  • $1,$2などは、捕捉基に対してbackreferencesである。
  • $&,$1,$2などの文字を得るには、$を2倍にして置き換えます。
+0

"記載されていないものは未定義と同じではありません。"この動作が文書化されていないという事実は、それを未定義にします。 'コンピュータプログラミングでは、未定義動作(UB)は、プログラムの現在の状態(メモリなど)に対して、その動作がコードに準拠している言語仕様で規定されていないコンピュータコードを実行した結果です。 - https://en.wikipedia.org/wiki/Undefined_behavior – ChrisJJ

+0

"マイクロソフトでは、長い間、文字をエスケープする特殊な意味を持っています。これを倍増させることで、&は共通のメタキャラクターです。推測。この場合、倍増して失敗します。 – ChrisJJ

+1

*この動作が文書化されていないため、定義されていません。MSDNのVBScriptのドキュメントは、[言語仕様](https://en.wikipedia.org/wiki/Programming_language_specification)(私の知る限り公開されていない)ではないことを理解していないだけです。 –

関連する問題