【问题标题】:What's the best way to keep regex matches in Excel?在 Excel 中保持正则表达式匹配的最佳方法是什么?
【发布时间】:2021-05-09 02:07:13
【问题描述】:

我正在处理“如何在 Microsoft Excel 中使用正则表达式 (Regex) 中的单元格和循环”中提供的优秀信息,但是我在试图保持匹配的表达式时遇到了困难,而不是比不匹配的部分:

当在电子表格中使用该函数时,“2022-02-14T13:30:00.000Z”将转换为“T13:30:00.000Z”而不是“2022-02-14”。下面列出的代码取自“如何在 Microsoft Excel 中使用正则表达式 (Regex),包括 in-cell 和 loops”。我虽然否定 strPattern2 会起作用,但我仍然遇到问题。非常感谢任何帮助。

Function simpleCellRegex(Myrange As Range) As String
    
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strPattern2 As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String
    
    
    strPattern = "^T{0-9][0-9][:]{0-9][0-9][:]{0-9][0-9][0-9][Z]"
    strPattern2 = "^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])"
    
    If strPattern2 <> "" Then
        strInput = Myrange.Value
        strReplace = ""
        
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern2
        End With
        
        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

【问题讨论】:

  • 你为什么用strPattern2而不是strPattern?您正在替换没有匹配的内容,因此导致您清除字符串的日期部分。
  • 旁注 - 您在 strPattern2 上的 If 语句也是不必要的,因为它永远不会是“”。
  • [-.] ;您的正则表达式也无法正确验证日期。以二月为例,尝试给它 31 天。然后是闰年。我猜它要么编写一个复杂的正则表达式,要么做出(并陈述)一些假设。

标签: excel regex vba regex-negation


【解决方案1】:

替换功能非常强大,但您需要做两件事:

  1. 如果您的正则表达式是myregexp>,请指定您要删除的所有字符,然后将其更改为^.*?(&lt;myregexp&gt;).*$,假设您的字符串中只有一个日期出现。括号称为“捕获组”,您可以稍后将它们作为替换模式的一部分引用。开头的 ^ 和结尾的 $ 确保即使 Global=True,您也只会匹配一次出现的模式。我注意到您已经在使用捕获组作为反向引用 - 您需要在反向引用编号上添加一个,因为我们添加了一个捕获组。以这种方式设置模式,整个字符串将参与匹配,我们将使用捕获组来保留我们想要保留的内容。
  2. 将您的strReplace="" 更改为strReplace="$1",表示您要替换与捕获组#1 的内容匹配的任何内容。

这是来自 Excel 的屏幕图,它使用我的 RegexpReplace 用户定义函数来处理您的示例以及我的建议:

我不得不修正你的时间部分正则表达式,因为你在你的意思是方格的地方使用了 3 次大括号,并且你完全省略了秒部分。请注意,通过调整开始和结束捕获组括号的位置,您可以在时间字符串的任一端保留或删除 T 和 Z。

另外,如果您的程序从可靠来源传递系统时间戳,那么它们已经格式良好,您不需要那些冗长的正则表达式来拒绝 3 月 32 日。您可以将这两个部分编码为 ([-0-9/.]{10,10})T([0-9:.]{12,12})Z,当你想要日期部分时使用 $1,当你想要时间部分时使用 $2。

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2023-02-25
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多