什么';在Excel中保存正则表达式匹配的最佳方法是什么?
我正在利用“如何在Microsoft Excel中在单元格和循环中使用正则表达式(Regex)”中提供的优秀信息,但是我遇到了一堵墙,试图保留匹配的表达式,而不是不匹配的部分: 在电子表格中使用该函数时,“2022-02-14T13:30:00.000Z”将转换为“T13:30:00.000Z”,而不是“2022-02-14”。下面列出的代码取自“如何在单元格和循环中使用MicrosoftExcel中的正则表达式(Regex)”。我认为否定strPattern2是可行的,但是我仍然有一些问题。非常感谢您的帮助什么';在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是可行的,但是我仍然有一些问题。非
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=“不匹配”
如果结束
如果结束
端函数
替换功能非常强大,但您需要做两件事:
^.*?().*$
假设字符串中只出现一次日期。括号被称为“捕获组”,您可以稍后将其作为替换模式的一部分引用。开头的“^”和结尾的“$”确保即使Global=True,也只匹配模式的一次出现。我注意到您已经在使用作为反向引用的捕获组-您需要在反向引用编号中添加一个,因为我们添加了一个捕获组。通过这种方式设置模式,整个字符串将参与匹配,我们将使用捕获组保留我们想要保留的内容strReplace=“
更改为strReplace=“$1”
,表示您希望替换与捕获组#1的内容匹配的内容([-0-9/]{10,10})T([0-9:.]{12,12})Z
当您希望日期部分使用$1,当您希望时间部分使用$2时。为什么要使用strPattern2
而不是strPattern
?您正在替换与之匹配的内容,因此会导致您清除字符串的日期部分。请注意,strPattern2
上的If语句是不必要的y也是,因为它永远不会是“.”[-.];而且你的正则表达式不能正确验证日期。以2月为例,试着给它31天。然后是闰年。我想要么写一个复杂的正则表达式,要么做(并陈述)一些假设。