代码之家  ›  专栏  ›  技术社区  ›  Ken Ingram

vba奇怪的regex问题

  •  1
  • Ken Ingram  · 技术社区  · 6 年前

    我正在Excel中使用Visual Basic更改一些数据

    模式:

    "^(" & Chr(167) & "\s)(\d+\:\d+)\.(\w+.*$)"
    

    在某些情况下,文本是:

    § 34:149.Lorem ipsum dolor sit amet
    

    我想把文本分成

    34:149 在当前单元格中,然后 "Lorem ipsum dolor sit amet" 在下一列中

    我遇到的问题是,给定的值如下所示:

    § 53:178.40
    

    regex返回: 53:178 作为一组然后 .40 作为另一个

    我无法在返回的子表达式组上获得一致性,因为 nnn:nnn.nn, .nn 作为附加组返回,而不是作为已划定组的成员返回。

    我对这里的行动感到困惑。我错过了什么, 因为我希望表格中有任何条目 NN:NN.NN 作为匹配项被拒绝。

    经过40分钟的反复试验,我没法找出故障所在。

    regex代码段是:

    strPattern = "^(" & Chr(167) & "\s)(\d+\:\d+)\.(\w+.*$)"
    replaceString = "$2"
    replaceString = "$2$3"
    replaceString2 = "$4"
    
    RE.Global = True
    RE.MultiLine = True
    RE.IgnoreCase = False
    RE.pattern = strPattern
    
    result1 = RE.Replace(source, replaceString)
    result2 = RE.Replace(source, replaceString2)
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Wiktor Stribiżew    6 年前

    \w 也匹配数字。使用 [a-zA-Z] 而不是匹配任何ASCII字母(您甚至不需要 + 之后):

    "^(" & Chr(167) & "\s)(\d+:\d+)\.([a-zA-Z].*$)"
    

    regex demo

    也, : 不是特殊的regex元字符,不需要转义。

    如果你想确定后面的字符 . 不是数字用法 [^0-9] \D 之后 \. :

    ^(§\s)(\d+:\d+)\.(\D.*)
    

    this regex demo . 如果不能是空白,请使用

    ^(§\s)(\d+:\d+)\.([^\d\s].*)
    

    another demo .

        2
  •  1
  •   Pᴇʜ    6 年前

    使用类似的模式 ^(§\s)([0-9:.]*)\.(\w+.*$) 看见 https://regex101.com/r/VGg7TJ/2

    所以这只接受任何匹配的数字,直到文本开始。