regex - 在 VBA 中使用 RegEx 将 d/m/yy 格式化为 yyyy-mm-dd 字符串

标签 regex vba

, SQL 语句中的澳大利亚日期被分隔并格式化为 #d/m/yyyy#。例如:

SELECT * FROM mytable WHERE mydate BETWEEN #2/1/2001# AND #4/3/2001# AND more...

我需要获取此 SQL 语句并对其进行修改,以便我可以将其呈现给 SQLite 作为:

SELECT * FROM mytable WHERE mydate BETWEEN '2001-01-02' AND '2001-03-04' AND more...

然后,任务是将 #xd/xm/yyyy# 转换为 'yyyy-mm-dd'。 “你好,世界!”正则表达式示例。

使用 使用 .Global = TRUE,我可以一步替换分隔符并重新排序元素:

vOldPattern = "#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#"
vNewPattern = "'$3-$2-$1'"

这给出了以下中间结果:

SELECT * FROM mytable WHERE mydate BETWEEN '2001-1-2' AND '2001-3-4' AND more...

我以为我可以一次填充所有个位数:

vOldPattern = "-(\d[-'])"
vNewPattern = "-0$1"

但这种方法只填充了第一个(月份)数字。我放弃并跑过两次传球,首先匹配 “-(\d-)”

然后继续 "-(\d')"

因此,通过三遍来更改格式和调整内容。当然,这个任务只有一个搜索/替换命令。有人可以自愿提供更优雅的解决方案吗?

而且,由于我必须编译和导出运行时,我想我不能使用后期绑定(bind),而是需要加载对 MS VBScript 正则表达式的引用。我在 Win7/32 中开发,但该应用程序需要与 WinXP 向后兼容(兼容?)。我应该加载哪个版本(1.0 或 5.5)的 VBScript RegEx 库?

干杯!

最佳答案

您可以使用正向前瞻来绕过仅填充第一个零 - 我认为这发生在您身上,因为最后一个 - 用于测试第二个 的非数字-

所以它可以简化为如下两种模式

我不认为它可以一次性完成,但我希望看到它。

我用过
2/12/2001
而不是
2/1/2001
证明替换处理混合字符串

Sub Test()
Dim strIn As String
Dim objRegex As Object
strIn = "SELECT * FROM mytable WHERE mydate BETWEEN #2/12/2001# AND #4/3/2001# AND more"
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Global = True
.Pattern = "#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#"
strIn = .Replace(strIn, ("$3-$2-$1"))
.Pattern = "(-)(\d)(?=[^\d])"
strIn = .Replace(strIn, "$10$2")
MsgBox strIn
End With
End Sub

关于regex - 在 VBA 中使用 RegEx 将 d/m/yy 格式化为 yyyy-mm-dd 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12721429/

相关文章:

javascript - 从任何给定字符串中删除任何给定字符

java - 为什么我在 Java String.split(regex) 中有空标记?

javascript - 如何从 Javascript 中的较大字符串中获取字符串?

regex - Perl 正则表达式用自己替换数字,只是高一个

vba - 仅循环浏览目录中存在的文本文件以使用 vba 导入数据

excel - 使用 VBA "With"语句来引用对象本身?

regex - 替换 Sublime Text 中的部分表达式?

excel等待网页打开

vba - 使用当前行的记录填充用户表单

vba - 逐个读取单元格并创建工作表