2010-03-06 73 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(?=.*?=)