runsnake 发表于 2013-1-26 15:10:47

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

本帖最后由 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)

haijie1223 发表于 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)

runsnake 发表于 2013-1-26 15:26:47

回复 2# haijie1223


    若这么简单,我就不问大侠了。你这个,居然把所有不合法的时间也全取到了。
注意:我只要取合法的时间表示

annybaby 发表于 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, ":\d(?=[^\d])|(?<=[^\d])\d:\d",3); ==> 下划线处该如何写?
_ArrayDisplay($aArray)

haijie1223 发表于 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 > 23 Or $m > 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

annybaby 发表于 2013-1-26 15:52:05

回复 5# haijie1223


似乎还是有点小问题,按楼主的要求
12:1
的表示是非法的,这里却输出了

haijie1223 发表于 2013-1-26 15:54:05

回复 6# annybaby


    呵呵,总之就是这么个思路了,懒得搞了,剩下的让楼主自己发挥一下吧。

annybaby 发表于 2013-1-26 15:54:51

回复 7# haijie1223

嗯,是的,一个正则的话,的确有些麻烦,其实我的表达式一样是有问题的`~

runsnake 发表于 2013-1-26 16:10:46

回复 6# annybaby


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

虽然注册时间很长了,但学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(?|2):\b)", 3)
_ArrayDisplay($aArray)

kevinch 发表于 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)((?\d|2)\:\d)(?=\D|$)", 3)
_ArrayDisplay($aArray)这个试下

runsnake 发表于 2013-1-26 16:31:31

回复 10# kevinch

谢谢回复
但你这个跟我在#9楼提出的问题一样呀:返回了第一个括号里的内容
实际上我们在写正则时,需要的都是匹配整个表达式的内容。
很少需要还返回第一个括号里的内容。不知au3这样处理是什么原因?
但帮助里明明写的是:3 Return array of global matches.

afan 发表于 2013-1-26 16:43:48

本帖最后由 afan 于 2013-1-26 16:47 编辑

回复kevinch

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


    不需要的组可用 ?:#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(?:?|2):\b)", 3)
_ArrayDisplay($aArray)这样也就不需要外面的括号了\b(?:?|2):\b

qq362817567 发表于 2013-1-26 16:50:36

(?<=^|\D)(?:?\d|2):\d(?=$|\D)用?:不捕获分组就是了

runsnake 发表于 2013-1-26 16:56:41

回复 12# afan


    多谢版主释疑呀,问题解决,原来还可以用(?:)这个东西。
页: [1]
查看完整版本: 『已解决』如何用正则获取所有合法的24小时制时间?