VBScript的正则表达式负面观察替代方案

时间:2009-08-31 14:36:08

标签: regex vbscript

由于VBScript不支持lookbehinds,我正在寻找替代解决方案。

我有字符串'\ E \ F \'。

我想将'F \'替换为'〜',但只有在它没有\ E之后才会替换。

替换后,我希望'\ E \ F \'为'\ E \ F \'。

如果字符串是'randomText \ F \',我希望它在替换后看起来像'randomText~'。

解决方案:

我刚刚决定对它进行StrReverse并做一个负面的前瞻。这不是最优雅的解决方案,但它似乎适用于这种情况。

Dim regEx, str1
str1 = StrReverse("The quick \F\ brown \E\F\ dog.")
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Pattern = "\\F\\(?!E\\)"
regEx.Global = True
ReplaceTest = regEx.Replace(str1, "%")

3 个答案:

答案 0 :(得分:8)

VBScript doesn’t support look-behind assertions.但请试试这个:

(^.?|[^\\].|\\[^E])\\F\\

或者这个:

(^.?|(?!\\E)..)\\F\\

将匹配替换为$1~(第一个子匹配和~)。

以下是一个解释:一般情况下有两种情况:如果\F\^.?)之前没有或只有一个字符,那么一切正常。但如果\F\之前至少有两个字符,我们需要确保这些字符不是\E。所以我们说,前两个字符是

  • \之外的任何字符后跟任意字符([^\\].)或
  • \后跟E\\[^E])以外的任何字符。

该构造确保允许除\E之外的所有其他组合。

这同样适用于第二个表达式。但是在这里我们使用负前瞻断言来确保\F\之前的两个字符不是\E

答案 1 :(得分:0)

你想要一个negative lookbehind

(?<!\\E)\\F\\

答案 2 :(得分:0)

不必使用正则表达式。这是一个解决方案

strString = "The quick \F\ brown \E\F\ dog"
s = Split(strString," ")
For i=1 To UBound(s)
    If Not InStr(s(i),"\E\F")> 0 And InStr(s(i),"\F") > 0 Then
        s(i) = "~"
    End If 
Next
strFinal=Join(s," ")
WScript.Echo strFinal

输出

C:\test>cscript /nologo test.vbs
The quick ~ brown \E\F\ dog