『已解决』如何用正则获取所有合法的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)
#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) 回复 2# haijie1223
若这么简单,我就不问大侠了。你这个,居然把所有不合法的时间也全取到了。
注意:我只要取合法的时间表示 回复 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)
#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
回复 5# haijie1223
似乎还是有点小问题,按楼主的要求
12:1
的表示是非法的,这里却输出了 回复 6# annybaby
呵呵,总之就是这么个思路了,懒得搞了,剩下的让楼主自己发挥一下吧。 回复 7# haijie1223
嗯,是的,一个正则的话,的确有些麻烦,其实我的表达式一样是有问题的`~ 回复 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: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)这个试下 回复 10# kevinch
谢谢回复
但你这个跟我在#9楼提出的问题一样呀:返回了第一个括号里的内容
实际上我们在写正则时,需要的都是匹配整个表达式的内容。
很少需要还返回第一个括号里的内容。不知au3这样处理是什么原因?
但帮助里明明写的是:3 Return array of global matches. 本帖最后由 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 (?<=^|\D)(?:?\d|2):\d(?=$|\D)用?:不捕获分组就是了 回复 12# afan
多谢版主释疑呀,问题解决,原来还可以用(?:)这个东西。
页:
[1]