找回密码
 加入
搜索
查看: 9604|回复: 26

[AU3基础] [已解决]日期的正则表达

 火.. [复制链接]
发表于 2015-7-15 16:43:03 | 显示全部楼层 |阅读模式
本帖最后由 yjing1982 于 2015-7-27 14:18 编辑

我在写程序时,想用正则表达,日期 d/M/YYYY,怎么用正则表达式通配。然后替换以前的日期为当天。这该怎么写?
 楼主| 发表于 2015-7-16 12:19:21 | 显示全部楼层
自己顶一下 ,
我写了这个程序进行匹配,始终不成功,返回值是0
$data = "6/14/2015"
$check = StringRegExp ($data, '([1-9]|1[012])/([1-9]|[12][0-9]|3[0,1])/(19[0-9]{2}|2[0-9]{3}))')
MsgBox(0, "", $check)
发表于 2015-7-16 15:23:38 | 显示全部楼层
$data = "6/14/2015"
$check = StringRegExp($data, '\d+/\d+/\d{4}', 3)
MsgBox(0, "", $check[0])
 楼主| 发表于 2015-7-16 16:51:04 | 显示全部楼层
本帖最后由 yjing1982 于 2015-7-16 16:54 编辑

谢谢,不过,我想了解下,在你的程序里可以调用数组check[0],我的函数怎么不行呢
发表于 2015-7-16 18:17:30 | 显示全部楼层
回复 4# yjing1982


    版本不同,我是3.3.9.4
 楼主| 发表于 2015-7-16 18:56:22 | 显示全部楼层
本帖最后由 yjing1982 于 2015-7-16 19:06 编辑

嗯,谢谢。根据你写的程序,我修改了自己的程序如下:
$data = "6/14/2015"
$check = StringRegExp ($data, '([1-9]|1[012])/([123]0|[012][1-9]|31)/(19[0-9]{2}|2[0-9]{3}))', 3)
MsgBox(0, "", $check[0])
不过,测试时,显示错误,Error:非数组使用下标。
另外,你的程序,在我的autoit是能正常运行的,能不能帮我分析下。
发表于 2015-7-17 06:38:17 | 显示全部楼层
本帖最后由 h20040606 于 2015-7-17 06:44 编辑

# TO 提问者
你的多了个),看一下语句的结尾。可能是笔误,这种错误很难发现

$check = StringRegExp ($data, '([1-9]|1[012])/([1-9]|[12][0-9]|3[0,1])/(19[0-9]{2}|2[0-9]{3})')
发表于 2015-7-17 06:47:02 | 显示全部楼层
回复 5# haijie1223


    与版本应该没有关系,他写错了。结尾处多写了)
我用的版本3.3.15.0
 楼主| 发表于 2015-7-17 09:07:27 | 显示全部楼层
恩,谢谢,我再看了下,的确多了一个“)”
 楼主| 发表于 2015-7-17 09:43:23 | 显示全部楼层
我再多提一个问题,如果正则表达式和普通表达式连起来写,该怎么写呢
我这种写法可以吗?不过又提示我$check不是数组
$data = "  Loaded VCAL Data on dpo1           (Last Cal:6/4/2015 08:42:45 UTC)"
$check = StringRegExp ($data, "  Loaded VCAL Data on dpo1           (Last Cal:([1-9]|1[012])/([123]0|[012][1-9]|31)/(2[0-9]{3}) 08:42:45 UTC)", 3)
MsgBox(0, "", $check[0])
发表于 2015-7-17 10:17:39 | 显示全部楼层
本帖最后由 h20040606 于 2015-7-17 10:24 编辑

回复 10# yjing1982


(1)关于日的这个地方写的有问题:    ([123]0|[012][1-9]|31)
按你的写法1日到9日需写成01到09了,原来的写法是对的。
或者改成 ([123]0|[012]{0,1}[1-9]|31)
(2) 括号 (和)是元字符,需要转义,写成 \( 和\) 。看一下 Last 前面的( 和UTC后面的)

$check = StringRegExp ($data, "  Loaded VCAL Data on dpo1           \(Last Cal:([1-9]|1[012])/([123]0|[012]{0,1}[1-9]|31)/(2[0-9]{3}) 08:42:45 UTC\)", 3)
发表于 2015-7-17 10:23:02 | 显示全部楼层
日期的匹配是很复杂的,上面的方法2/31/2015 4/31/2015也能匹配上。
 楼主| 发表于 2015-7-17 11:15:42 | 显示全部楼层
本帖最后由 yjing1982 于 2015-7-17 12:10 编辑

回复 12# h20040606


   那只要在正则表达式的语句里,就一定要符合正则表达式的规则咯,我可以用^$来结束正则,然后用普通表达式的规则呢?
如果可以的话,两个表达式在一条语句的话,有哪些需要注意的?
   另外,我想设计一个替换原有时间的程序,我的程序这么写,无法替换的原因是什么呢?ps:如果我写具体时间是可以替换的。
#include <File.au3>
$t_path = "C:\Users\admin\Desktop\123.txt"
$find = "  Loaded VCAL Data on dpo1           \(Last Cal:([1-9]|1[012])/([1-9]|[12][0-9]|3[0,1])/(19[0-9]{2}|2[0-9]{3}) 08:42:45 UTC\)"
$replace= "  Loaded VCAL Data on dpo1           (Last Cal:7/14/2015 08:42:45 UTC)"
_ReplaceStringInFile($t_path, $find, $replace)
发表于 2015-7-17 12:43:00 | 显示全部楼层
本帖最后由 h20040606 于 2015-7-17 12:51 编辑

回复 13# yjing1982


    用StringRegExpReplace:参考下面
$data = "  Loaded VCAL Data on dpo1           (Last Cal:6/04/2015 08:42:45 UTC)"
$return=StringRegExpReplace($data,"([1-9]|1[012])/([123]0|[012]{0,1}[1-9]|31)/(2[0-9]{3})", '7/14/2015')
MsgBox(0,"",$return)
 楼主| 发表于 2015-7-17 13:35:22 | 显示全部楼层
回复 14# h20040606


    你说的我理解。我也看到了$return可以返回修改值。我现在需要对我的123.txt文件进行时间上的修改。我该怎么写呢?谢谢。
   背景及需求,公司里有很多.txt文件时间都是以前的,我想用autoit,把时间改成当天或特定时间。我看正则表达式可以匹配原来日期,然后我想用_ReplaceStringInFile,进行替换。一开始,我使用具体日期是可以替换的,即我用7/17/2015是可以替换原来日期的,不过用正则表达式就替换不了了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 00:01 , Processed in 0.080220 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表