在access中,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'
。 “Hello,World!”正则表达式的例子。
将vba regexp与.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库?
干杯!
答案 0 :(得分:1)
你可以使用一个积极的先行来绕过第一个零填充 - 我认为这是因为你在测试第二个-
的非数字时消耗的最后一个-
/ p>
因此可以将其简化为以下两种模式
我认为不能一次完成,但我想看到它。
我用过
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
答案 1 :(得分:0)
我相信你可以使用Format()
function执行整个任务。
如果没有,你可以使用Format()将前导零放入。像这样:
vNewPattern = _
"'" & Format("$3","00") & "-" & Format("$2","00") & "-" & Format("$1","00")
不可否认,这并不优雅。但是,很明显,它应该同样有效。
答案 2 :(得分:0)
不需要正则表达式。只需使用format()函数:
Dim myDate As Date
myDate = #4/3/2001#
Debug.Print Format(myDate, "yyyy-mm-dd")
答案 3 :(得分:0)
Brett上面的回答对我来说足够优雅。我稍微简化了第二遍的语法,但将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和我都希望看到这个问题的单程解决方案。我敢打赌,我们可以用好的方式做到这一点!
我原来问题的第二部分是我应该注册的VBScript RegEx库的哪个版本(1.0或5.5),以便我可以生成运行时应用程序。我扣动扳机并选择了5.5。版本(自1999年以来它真的出现过吗?)。应用程序编译成功。如果它没有独立运行,我会告诉你。