【问题标题】:Reformat multiple dates in string using EXCEL VBA REGEX使用 EXCEL VBA REGEX 重新格式化字符串中的多个日期
【发布时间】:2018-10-27 20:48:08
【问题描述】:

我有一个应用程序,它以将文本复制到剪贴板的形式输出查询。

我想出将文本解析为数组,然后将其填充回 excel。

源字符串包含格式为“dd.mm.yyyy”的多个日期实例,我一直在输出列上使用查找/替换将其更改为“dd/mm/yyyy”。我想知道在使用正则表达式解析到数组之前是否可以/更快地在字符串中替换这些。

strPattern = "(0?[1-9]|[12][0-9]|3[01])[\.](0?[1-9]|1[012])[\.]\d{4}"
strReplace = "$dd\/dd\/dddd"

    With regEx
        .Global = True
        .MultiLine = False
        .IgnoreCase = False
        .Pattern = strPattern
    End With

    If regEx.test(sString) Then
        sString = regEx.Replace(sString, strReplace)
    End If

最终结果还不是我所希望的。我认为“strReplace”的格式是错误的,但我不太了解正则表达式来修复它。以上是通过(太多)小时的网络搜索实现的。

感谢您的帮助。

【问题讨论】:

  • 试试strReplace = "$1/$2/$3" BTW,你不需要测试字符串是否匹配。如果没有匹配,则字符串不会被修改。
  • 返回 dd/mm/$3。这么近
  • 是的,因为\d{4} 周围没有捕获组。使用"(0?[1-9]|[12][0-9]|3[01])\.(0?[1-9]|1[012])\.(\d{4})" 模式和strReplace = "$1/$2/$3"

标签: regex excel vba date replace


【解决方案1】:

使用

strPattern = "(0?[1-9]|[12][0-9]|3[01])\.(0?[1-9]|1[012])\.(\d{4})"
strReplace = "$1/$2/$3"

With regEx
    .Global = True
    .MultiLine = False
    .IgnoreCase = False
    .Pattern = strPattern
End With

sString = regEx.Replace(sString, strReplace)

注意:

  • 您可以使用替换字符串中的$n 占位符来引用捕获组值
  • 您不需要使用[\.],它与\.(或[.])相同
  • 您不需要测试字符串是否匹配。如果没有匹配,字符串将不会被修改。

提示:如果要将这些字符串匹配为“整个单词”,请使用单词边界\b

strPattern = "\b(0?[1-9]|[12][0-9]|3[01])\.(0?[1-9]|1[012])\.(\d{4})\b"

现在,只有在不包含字母、数字或_ 字符的情况下才能找到类似日期的字符串。

【讨论】:

  • 非常感谢您的快速响应和有用的提示。问题解决了。
猜你喜欢
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2017-12-22
  • 2011-08-29
  • 2016-06-17
  • 1970-01-01
相关资源
最近更新 更多