代码之家  ›  专栏  ›  技术社区  ›  mwolfe02

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

  •  1
  • mwolfe02  · 技术社区  · 14 年前

    我正在尝试编写一个正则表达式(通过autohotkey的regexreplace函数),作为版本控制的预处理步骤,该表达式将在导出的vba代码中强制执行变量大小写。因此,如果我想将所有不区分大小写的“firstname”更改为与该大小写匹配,请执行以下行:

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

    将被翻译成:

    If firstName = "" Then MsgBox "Please enter FirstName"
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   Bart Kiers    14 年前

    如果您的工具/编辑器支持look 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”(不区分大小写)前面有零个或偶数个双引号,直到行尾时,它才与字符串“firstname”匹配。

    请注意,如果您的行以注释结尾,并且注释中有引号,则它将失败!

        2
  •  0
  •   Ikke    14 年前

    regexp不区分上下文,因此很难做到这一点。

        3
  •  0
  •   Ahmad Mageed    14 年前

    如果你总是期待 FirstName 出现在报价单末尾 " 之后,你可以用否定的眼光看一下周围没有多少这样的事情: FirstName(?!")

    否则,如果您不能保证右引号的位置,那么使用regex将不是理想的选择。

    或者你可以把注意力集中在 = 在之前发生的任何事情上签名并匹配。在这种情况下,积极的展望很有用: FirstName(?=.*?=)

        4
  •  0
  •   High Performance Mark    14 年前

    正则表达式本身不 东西,他们 接受 串。类正则表达式

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

    无论使用何种情况,都将接受字符串“firstname”。然后用所选语言编写一个替换操作,以替换用“firstname”识别的字符串。您可能会发现所选正则表达式实现具有不区分大小写的匹配功能,这将简化正则表达式。

    问题在于,如果firstname在表达式中的位置不正确,则不能修改它的大小写——即如何更改示例中firstname的第一个匹配项,而不是第二个匹配项。在sed中很简单,因为默认情况下,它只在第一次匹配一行regex时进行替换。在VBA我一点也不知道。

    你的规则是:

    • 只对第一个匹配进行转换大小写;
    • transform case只在字符串中第一个=符号的左边;
    • 仅当匹配不在“”内时转换大小写;

    ?

    如果第三个可能有问题,如果“”可以嵌套。regex不能真正处理任意深度的括号嵌套(不管用什么字符来括起来),尽管有些实现有办法绕过这个限制。但是,如果您发现自己试图编写一个正则表达式来匹配特定数量的匹配方括号中的字符串,则可以确定您使用了错误的工具。

    编辑:在第三种情况下,将我的regex修改为

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

    它应该与任何出现在firstname前面的