VBA正则表达式,替换分组

8

我正在使用Excel中的VBA正则表达式替换格式不正确的日期字符串(以及其他项目)。

我希望替换掉那些缺少破折号分隔符的正确格式为YYYY-MMM-DD的日期字符串,例如:

2014,APRIL,04 or 
2014.Apr,04 or
2014/Apr-04

我希望它们的格式可以像这两种之一:

2014-Apr-04
2014-April-04
(即保留提供的年、月、日元素,但仅将分隔符替换为破折号,而不是逗号、句点或其他奇怪字符) 我目前拥有的代码是:
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = False ' Several occurrence to be found
    .IgnoreCase = True
    .Pattern = "(((19|20)[0-9]{2})[, /.]([a-zA-Z]+)[, /.](0[1-9]|[12][0-9]|3[01])[, /.])"
End With

Dim ReplacePattern As String
ReplacePattern = "$1-$2-$3"

Dim match As Boolean
match = RE.Test(LogEntryTxt)

LogEntryTxt = RE.Replace(LogEntryTxt, ReplacePattern)

但似乎替换并不正确。有人能帮忙吗?我尝试了研究命名组、编号组等,但是我尝试的都没有完成它。

1个回答

6
您的替换出现了问题,因为您在匹配的某些部分周围有捕获组,这些捕获组不会对应于$1-$2-$3以形成YYYY-MMM-DD。您可以保留当前的正则表达式模式并将$2-$4-$5用于替换,或者采取更优雅的方法,将您不需要后续引用的捕获组更改为非捕获组:

(?:((?:19|20)[0-9]{2})[, /.]([a-zA-Z]+)[, /.](0[1-9]|[12][0-9]|3[01])[, /.]) ^^ ^^

然后像您目前正在做的那样使用$1-$2-$3进行替换。


谢谢!!!我简直不敢相信我竟然忽略了这么愚蠢的事情!!!:) 真的非常感谢你。 - user3477276

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接