1

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

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

将被翻译成:

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

4 回答 4

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' (不区分大小写),只有当它前面有 0 个或偶数个双引号直到行尾。

请注意,如果您的行以包含引号的注释结尾,它将失败!

于 2010-03-06T16:19:28.190 回答
0

正则表达式对上下文不敏感,因此很难做到这一点。

于 2010-03-06T15:52:46.470 回答
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]

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

于 2010-03-06T16:15:29.830 回答
0

如果您总是希望FirstName出现在引文的末尾并在其后出现结尾",那么您可以使用负面的环视来避免出现太多此类事件:FirstName(?!")

否则,如果您不能保证结束报价的这种位置,则为此使用正则表达式将不理想。

或者,您可以专注于=标志并匹配它之前发生的任何事情。在这种情况下,积极的前瞻性会派上用场:FirstName(?=.*?=)

于 2010-03-06T16:18:15.273 回答