找回密码
 加入
搜索
查看: 4491|回复: 13

[AU3基础] 『已解决』如何用正则获取所有合法的24小时制时间?

 火.. [复制链接]
发表于 2013-1-26 15:10:47 | 显示全部楼层 |阅读模式
本帖最后由 runsnake 于 2013-1-26 16:58 编辑

合法的表示:12:23 9:01 02:03 23:59
非法的表示:32:24 20:60 25:32 12:1 8:61

请问,如何用StringRegExp函数把所有合法的表示时间都取出来?

#include <Array.au3>
$sStr = "12:23 9:01 02:03 23:59 32:24 20:60 25:32 12:1 8:61"
$aArray = StringRegExp($sStr, "_____________",  3)  ; ==> 下划线处该如何写?
_ArrayDisplay($aArray)
发表于 2013-1-26 15:19:02 | 显示全部楼层
#include <Array.au3>
$sStr = "12:23 9:01 02:03 23:59 32:24 20:60 25:32 12:1 8:61"
$aArray = StringRegExp($sStr, "(\d+:\d+)",  3)  ; ==> 下划线处该如何写?
_ArrayDisplay($aArray)
 楼主| 发表于 2013-1-26 15:26:47 | 显示全部楼层
回复 2# haijie1223


    若这么简单,我就不问大侠了。你这个,居然把所有不合法的时间也全取到了。
注意:我只要取合法的时间表示
发表于 2013-1-26 15:41:36 | 显示全部楼层
回复 1# runsnake

#include <Array.au3>
$sStr = "12:23 9:01 02:03 23:59 32:24 20:60 25:32 12:1 8:61"
$aArray = StringRegExp($sStr, "[0-2][0-3]:[0-5]\d(?=[^\d])|(?<=[^\d])\d:[0-5]\d",  3)  ; ==> 下划线处该如何写?
_ArrayDisplay($aArray)

评分

参与人数 1金钱 +10 收起 理由
haijie1223 + 10 学习~

查看全部评分

发表于 2013-1-26 15:43:48 | 显示全部楼层
#include <Array.au3>
$sStr = "12:23 9:01 02:03 23:59 32:24 20:60 25:32 12:1 8:61"
$aArray = StringRegExp($sStr, "(\d+:\d+)", 3) ; ==> 下划线处该如何写?
For $i = 0 To UBound($aArray) - 1
        $m = StringSplit($aArray[$i], ":")
        If $m[1] > 23 Or $m[2] > 59 Then $aArray[$i] = ""
Next
$aArray = _Array_MElement($aArray, "")
_ArrayDisplay($aArray)

Func _Array_MElement($HArray, $Element, $NewElement = "", $Flag = "")
        If Not IsArray($HArray) Then Return 0
        If $Flag = "" Or $Flag = 0 Then
                Local $m = 0, $n = 0
                Local $LArray = $HArray
                For $i = 0 To UBound($HArray) - 1
                        If $LArray[$i] = $Element Then
                                $m = $m + 1
                        Else
                                $HArray[$n] = $LArray[$i]
                                $n = $n + 1
                        EndIf
                Next
                For $i = (UBound($HArray) - 1) To (UBound($HArray) - $m) Step -1
                        _ArrayDelete($HArray, $i)
                Next
        ElseIf $Flag = 1 Then
                For $i = 0 To UBound($HArray) - 1
                        If $HArray[$i] = $Element Then
                                $HArray[$i] = $NewElement
                        EndIf
                Next
        EndIf
        Return $HArray
EndFunc   ;==>_Array_MElement
发表于 2013-1-26 15:52:05 | 显示全部楼层
回复 5# haijie1223


似乎还是有点小问题,按楼主的要求
12:1
的表示是非法的,这里却输出了
发表于 2013-1-26 15:54:05 | 显示全部楼层
回复 6# annybaby


    呵呵,总之就是这么个思路了,懒得搞了,剩下的让楼主自己发挥一下吧。
发表于 2013-1-26 15:54:51 | 显示全部楼层
回复 7# haijie1223

嗯,是的,一个正则的话,的确有些麻烦,其实我的表达式一样是有问题的`~
 楼主| 发表于 2013-1-26 16:10:46 | 显示全部楼层
回复 6# annybaby


    谢谢两位,我自己也写了个,如下:
但想问的是,如何才能让得到的数组只有全匹配的?下面的结果中,还有第一个括号里的内容呀?
当然若再对数组处理:只取下标[0],[2],[4],[6]的元素值,就可以了。

虽然注册时间很长了,但学au3时间不长。
问个简单的问题,就是针对StringRegExp函数,实际应用中,往往我需要的是:符合‘匹配整个表达式’的所有字符串,也就帮助里的global matches。但当flag=3时,老是还会返回的是第一个括号内容,如下面的代码,若把最外层的括号去掉,甚至只返回第一个括号里的内容,这跟别的语言很不一样,让我很迷糊。本按一般逻辑思维,都只需要返回符合整个表达式串?


#include <Array.au3>
$sStr = "12:23 9:01 02:03 23:59 32:24 20:60 25:32 12:1 8:61"
$aArray = StringRegExp($sStr, "(\b([01]?[0-9]|2[0-3]):[0-5][0-9]\b)", 3)
_ArrayDisplay($aArray)
发表于 2013-1-26 16:24:42 | 显示全部楼层
本帖最后由 kevinch 于 2013-1-26 16:26 编辑
#include <Array.au3>
$sStr = "12:23 9:01 02:03 23:59 32:24 20:60 25:32 12:1 8:61"
$aArray = StringRegExp($sStr, "(?s)(?<=^|\D)(([01]?\d|2[0-3])\:[0-5]\d)(?=\D|$)", 3)
_ArrayDisplay($aArray)
这个试下
 楼主| 发表于 2013-1-26 16:31:31 | 显示全部楼层
回复 10# kevinch

谢谢回复
但你这个跟我在#9楼提出的问题一样呀:返回了第一个括号里的内容
实际上我们在写正则时,需要的都是匹配整个表达式的内容。
很少需要还返回第一个括号里的内容。不知au3这样处理是什么原因?
但帮助里明明写的是:3 Return array of global matches.
发表于 2013-1-26 16:43:48 | 显示全部楼层
本帖最后由 afan 于 2013-1-26 16:47 编辑
回复  kevinch

谢谢回复
但你这个跟我在#9楼提出的问题一样呀:返回了第一个括号里的内容
实际上我们 ...
runsnake 发表于 2013-1-26 16:31



    不需要的组可用 ?:
#include <Array.au3>
$sStr = "12:23 9:01 02:03 23:59 32:24 20:60 25:32 12:1 8:61"
$aArray = StringRegExp($sStr, "(\b(?:[01]?[0-9]|2[0-3]):[0-5][0-9]\b)", 3)
_ArrayDisplay($aArray)
这样也就不需要外面的括号了
\b(?:[01]?[0-9]|2[0-3]):[0-5][0-9]\b
发表于 2013-1-26 16:50:36 | 显示全部楼层
(?<=^|\D)(?:[01]?\d|2[0-3]):[0-5]\d(?=$|\D)用?:不捕获分组就是了
 楼主| 发表于 2013-1-26 16:56:41 | 显示全部楼层
回复 12# afan


    多谢版主释疑呀,问题解决,原来还可以用(?:)这个东西。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-1 17:17 , Processed in 0.094301 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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