由于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, "%")
答案 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