正则表达式忽略双引号部分

时间:2010-03-06 15:45:07

标签: regex autohotkey

我正在尝试编写一个正则表达式(通过Autohotkey的RegExReplace函数),它将在导出的VBA代码中强制执行变量大小写,作为版本控制的预处理步骤。因此,如果我希望将所有不区分大小写的'firstName'更改为匹配该情况,则接下来的行:

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

将被翻译成:

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

4 个答案:

答案 0 :(得分:2)

如果您的工具/编辑器支持预览,您可以尝试:

(?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'(不区分大小写),只要它在它之前有零或偶数双引号,直到行结束。

请注意,如果您的行以包含引号的注释结束,则会失败!

答案 1 :(得分:0)

Regexp不是上下文敏感的,所以要做到这一点非常困难。

答案 2 :(得分:0)

正则表达式本身并不是的东西,而是接受字符串。像

这样的正则表达式

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

无论使用何种情况,

都会接受字符串'firstname'。然后用您选择的语言编写替换操作,以替换用'firstName'识别的字符串。您可能会发现您选择的正则表达式实现具有不区分大小写的匹配功能,这将简化正则表达式。

你遇到的问题是当它不在你的表达式中的正确位置时不修改FirstName的情况 - 即如何更改示例中第一次出现的FirstName,而不是第二次出现。在sed中它很容易,因为默认情况下它只在第一次匹配正则表达式时进行替换。在VBA中,我没有任何线索。

你的规则是:

  • 仅对第一场比赛进行转换;
  • 仅将字符串转换为字符串中第一个=符号的左侧;
  • 仅当匹配不在“”;
  • 内时转换大小写

如果第三个你可能有问题,如果“”可以嵌套。正则表达式无法真正处理括号的任意深度嵌套(无论使用哪个字符括号),尽管某些实现方法可以解决此限制。但是,如果您发现自己试图编写正则表达式以匹配特定数量的匹配括号内的字符串,则可以确定您使用的是错误的工具。

编辑:在第三种情况下修改我的正则表达式

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

应匹配任何出现的名字前面没有“

答案 3 :(得分:0)

如果您始终希望FirstName出现在引号的末尾,并且后面有",那么您可以使用负面外观来减少这种情况:{{1} }

否则,如果您无法保证结束报价的这种放置,那么使用正则表达式将是不理想的。

或者,您可以专注于FirstName(?!")符号并匹配之前发生的任何事情。在这种情况下,积极的前瞻就派上用场了:=