VBScript的正则表达式负向回顾后发现的替代方案

5

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

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

我想要将 \F\ 替换为 '~',但只有在它前面没有 \E 的情况下才能替换。

替换后,我希望 '\E\F\' 仍然是 '\E\F\'。

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

解决方案:

我决定倒转它并进行负向前瞻。 这不是最优雅的解决方案,但在这种情况下似乎可以工作。

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, "%")

不同的正则表达式库有不同的语法。你正在将什么输入到你的正则表达式中? - moonshadow
3个回答

9

VBScript不支持向后查找断言。 但是可以尝试以下方法:

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

或者这个:
(^.?|(?!\\E)..)\\F\\

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

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

  • 除了\之外的任何字符后跟任意字符([^\\].),要么是
  • \后跟除E以外的任何字符(\\[^E])。

这个结构确保允许除\E以外的每种组合。

第二个表达式也是如此。但是这里我们使用负向先行断言来确保\F\之前的两个字符不是\E


快速的\F\棕色FF\E\F\狗。变成了快~棕色FF\E\F\狗。 - Chris
@Chris:你需要用第一个子匹配和~替换匹配,所以是$1~ - Gumbo
抱歉,我错过了。乍一看它们似乎有效。让我试着解密它们并进行一些测试。然后,我会给你信用。 - Chris
不错啊!还是应该说“不错的两个”? :) 我本来会在\\[^E]?中省略'?',但似乎两种方式都可以。 - Alan Moore
它们似乎有效。如果您能够快速概述其中一个,我会很感激。我对正则表达式有一些了解,但我仍然难以完全理解这些解决方案。 - Chris

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

0

虽然我认为你需要在末尾添加一个额外的 \。 - Simon Nickerson
3
VBScript(以及JavaScript和JScript)正则表达式不支持向后查找(http://www.regular-expressions.info/vbscript.html)。你可以尝试搜索“VBScript Lookbehind”来寻找替代方案,或者改用支持该功能的编程语言(http://www.regular-expressions.info/refflavors.html,搜索“Lookaround”)。 - ax.
VBScript不支持向后查找,而且OP明确要求提供替代方案。 - Zlatin Zlatev
1
@ZlatinZlatev 原始问题(我回答的)没有提到后顾:http://stackoverflow.com/revisions/1357769/1 - ax.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接