什么';在Excel中保存正则表达式匹配的最佳方法是什么?

什么';在Excel中保存正则表达式匹配的最佳方法是什么?,excel,regex,vba,regex-negation,Excel,Regex,Vba,Regex Negation,我正在利用“如何在Microsoft Excel中在单元格和循环中使用正则表达式(Regex)”中提供的优秀信息,但是我遇到了一堵墙,试图保留匹配的表达式,而不是不匹配的部分: 在电子表格中使用该函数时,“2022-02-14T13:30:00.000Z”将转换为“T13:30:00.000Z”,而不是“2022-02-14”。下面列出的代码取自“如何在单元格和循环中使用MicrosoftExcel中的正则表达式(Regex)”。我认为否定strPattern2是可行的,但是我仍然有一些问题。非

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

在电子表格中使用该函数时,“2022-02-14T13:30:00.000Z”将转换为“T13:30:00.000Z”,而不是“2022-02-14”。下面列出的代码取自“如何在单元格和循环中使用MicrosoftExcel中的正则表达式(Regex)”。我认为否定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

函数simpleCellRegex(Myrange作为范围)作为字符串
Dim regEx作为新的RegExp
作为字符串的Dim strPattern
将strPattern2设置为字符串
像弦一样的模糊的条纹
变暗字符串替换为字符串
作为字符串的暗输出
strPattern=“^T{0-9][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])”
如果strPattern2“”,则
strInput=Myrange.Value
strReplace=“”
用正则表达式
.Global=True
.MultiLine=True
.IgnoreCase=False
.Pattern=strPattern2
以
如果正则表达式测试(strInput),则
simpleCellRegex=regEx.Replace(strInput,strReplace)
其他的
simpleCellRegex=“不匹配”
如果结束
如果结束
端函数

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

  • 指定要删除的所有字符(如果您的regexp为),然后将其更改为
    ^.*?().*$
    假设字符串中只出现一次日期。括号被称为“捕获组”,您可以稍后将其作为替换模式的一部分引用。开头的“^”和结尾的“$”确保即使Global=True,也只匹配模式的一次出现。我注意到您已经在使用作为反向引用的捕获组-您需要在反向引用编号中添加一个,因为我们添加了一个捕获组。通过这种方式设置模式,整个字符串将参与匹配,我们将使用捕获组保留我们想要保留的内容
  • 将您的
    strReplace=“
    更改为
    strReplace=“$1”
    ,表示您希望替换与捕获组#1的内容匹配的内容
  • 下面是Excel的一个屏幕打印,使用my RegexpReplace用户定义函数处理您的示例和我的建议:

    我必须修正你的时间部分regexp,因为你三次使用了方括号,而你完全忽略了秒部分。注意,通过调整捕获组括号的开始和结束位置,你可以在时间字符串的任意一端保留或删除T&Z

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

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