2010-03-06 72 views
1

我想寫一個正則表達式(通過Autohotkey的RegExReplace函數),它將強制變量在導出的VBA代碼中作爲預處理步驟進行版本控制。所以,如果我想改變「的firstName」的所有不區分大小寫的出現,以這種情況下匹配,那麼下面一行:正則表達式忽略雙引號部分

If FirstName = "" Then MsgBox "Please enter FirstName" 

將被翻譯成:

If firstName = "" Then MsgBox "Please enter FirstName" 

回答

2

如果您的工具/編輯器支持一下aheads,你可以嘗試:

(?im)FirstName(?=([^"]*"[^"]*")*[^"]*$) 

這意味着:

(?im)  # enable case insensitive matching, multi-line option 
F   # match the character 'F' or 'f' 
i   # match the character 'i' or 'I' 
r   # match the character 'r' or 'R' 
s   # match the character 's' or 'S' 
t   # match the character 't' or 'T' 
N   # match the character 'N' or 'n' 
a   # match the character 'a' or 'A' 
m   # match the character 'm' or 'M' 
e   # match the character 'e' or 'E' 
(?=   # start positive look ahead 
    (   # start capture group 1 
    [^"]* #  match any character except '"' and repeat it zero or more times 
    "  #  match the character '"' 
    [^"]* #  match any character except '"' and repeat it zero or more times 
    "  #  match the character '"' 
)*   # end capture group 1 and repeat it zero or more times 
    [^"]*  # match any character except '"' and repeat it zero or more times 
    $   # match the end of a line 
)   # end positive look ahead 

用簡單的英語:只有在字符串「FirstName」(不區分大小寫)的情況下,該字符串的值才爲零,或者在該行的末尾加上偶數個雙引號。

請注意,如果您的文字以包含引號的評論結尾,它將會失敗!

+0

太棒了。這似乎有伎倆。非常感謝。 – mwolfe02 2010-03-06 16:32:00

+0

不客氣mwolfe02。 – 2010-03-06 16:37:38

+0

我沒有在我的問題中指定這個,但我需要避免替換出現在另一個單詞內的單詞。我通過添加\ b來檢查'文字邊界'來完成這項工作。正在使用的正則表達式現在是:(?im)\ bFirstName \ b(?=([^「] *」[^「] *」)* [^「] * $) – mwolfe02 2010-03-06 16:55:27

0

正則表達式是不是上下文敏感的,所以這很難做到。

0

正則表達式,在自己的,不要東西,他們接受字符串。像

[fF][iI][rR][sS][tT][nN][aA][mM][Ee]

regex將接受任何使用情況下,字符串「名字」。然後,用您選擇的語言編寫替換操作來替換用'firstName'識別的字符串。您可能會發現,您選擇的正則表達式實現具有不區分大小寫的匹配功能,可以簡化正則表達式。

你的問題是在不修改名字的情況下,當它不是在你的表達中的正確位置 - 即你如何改變你的例子中FirstName的第一次出現,但不是第二次。在sed中很容易,因爲默認情況下,只有在第一次匹配正則表達式時纔會進行替換。在VBA中我沒有任何線索。

是您的規則:

  • 變換情況只是第一場比賽;
  • 只將變換大小寫在字符串的第一個左邊=符號;
  • 只有當匹配不在裏面時才轉換case「」;

如果第三個可能有問題,如果可以嵌套。正則表達式無法真正處理任意深度的括號嵌套(無論用什麼字符括起來),儘管有些實現方法可以解決這個限制。但是,如果您發現自己試圖編寫正則表達式來匹配特定數量的匹配括號內的字符串,則可以確定您使用的是錯誤的工具。

編輯:在第三的情況下修改我的正則表達式來

.*[^"].*[fF][iI][rR][sS][tT][nN][aA][mM][Ee]

應該匹配不是由「

+0

第三種情況。我並不擔心嵌套的引號。 – mwolfe02 2010-03-06 16:24:44

0

之前姓名的任何發生。如果你總是希望FirstName出現在年底與之後的收盤價爲"的報價,那麼您可以使用負值的環視比例來表示這樣的情況:FirstName(?!")

否則,如果y ou無法保證結束報價的這種放置,因此使用正則表達式並不理想。

或者,您可以將注意力集中在=符號上並匹配之前發生的任何事情。在這種情況下,積極的前瞻就派上用場了:FirstName(?=.*?=)