3

中,报表中的澳大利亚日期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')"

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

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

干杯!

4

4 回答 4

1

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

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

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

我用
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
于 2012-10-04T08:59:01.973 回答
0

Format()我相信您可以使用该功能执行整个任务。

如果没有,您可以使用 Format() 将前导零放入。这样的事情:

vNewPattern = _
    "'" & Format("$3","00") & "-" & Format("$2","00") & "-" & Format("$1","00")

诚然,它并不优雅。但是,这很清楚,而且应该同样有效。

于 2012-10-04T08:18:56.720 回答
0

正则表达式不是必需的。只需使用 format() 函数:

Dim myDate As Date
myDate = #4/3/2001#
Debug.Print Format(myDate, "yyyy-mm-dd")
于 2012-10-04T08:24:18.803 回答
0

布雷特上面的回答对我来说已经足够优雅了。我稍微简化了第二遍的语法,但留下了 Brett 的解决方案作为注释。

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")
.Pattern = "-(\d)(?=[^\d])"
strIn = .Replace(strIn, "-0$1")
MsgBox strIn
End With
End Sub

brettdj 和我都希望看到这个问题的单通道解决方案。我敢打赌我们可以用好的 ol' perl 做到这一点!

我最初问题的第二部分是我应该注册哪个版本的 VBScript RegEx 库(1.0 或 5.5),以便生成运行时应用程序。我扣动扳机,只选择了 5.5。版本(自 1999 年以来真的存在吗?)。应用程序编译成功。如果它不作为独立运行,我会告诉你。

于 2012-10-05T02:19:07.913 回答