2009-08-31 70 views
4

由於VBScript不支持lookbehinds,因此我正在尋找替代解決方案。VBScript的正則表達式負面Lookbehind替代方案

我有字符串'\ 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

不同的正則表達式庫具有不同的語法。你正在給正則表達式提供什麼? – moonshadow 2009-08-31 14:43:45

回答

8

VBScript doesn’t support look-behind assertions.但試試這個:

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

或者這樣:

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

$1~更換比賽(第一SUBM atch和~)。

下面是一個解釋:通常有兩種情況:如果在\F\^.?)之前沒有或只有一個字符,則一切正常。但是如果在\F\之前至少有兩個字符,我們需要確保這些字符不是\E。所以我們說,這兩個人物前述要麼

  • 除了\後跟任意字符([^\\].),或
  • \任何字符其次是其他然後E\\[^E])的任何字符。

該結構確保允許除\E之外的其他所有梳齒。

這同樣適用於第二個表達式。但是在這裏,我們使用否定前瞻斷言來確保\F\之前的兩個字符不是\E

+0

快速\ F \棕色FF \ E \ F \狗。變成quic〜棕色FF \ E \ F \狗。 – Chris 2009-08-31 17:41:23

+0

@Chris:你需要用第一個submatch和'〜'替換匹配,所以'$ 1〜'。 – Gumbo 2009-08-31 17:54:18

+0

對不起。錯過了。他們似乎乍一看工作。讓我試着破譯它們並做一些測試。然後,我會給你信貸。 – Chris 2009-08-31 18:43:51

0

你想negative lookbehind

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

雖然我認爲你需要一個額外的\\在末尾 – 2009-08-31 14:47:32

+0

是的,謝謝。更新。 – 2009-08-31 14:56:33

+3

VBScript(以及JavaScript和JScript)正則表達式不支持lookbehind(http:// www。regular-expressions.info/vbscript.html)。您可能會發現一些替代Google搜索的「VBScript Lookbehind」。或更改爲支持它的語言(http://www.regular-expressions.info/refflavors.html,搜索「Lookaround」) – 2009-08-31 16:21:38

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