找回密码
 加入
搜索
查看: 4611|回复: 9

[AU3基础] au3的正则匹配支持submatches吗?(决定采用自定义函数的方式) - 【已解决】

  [复制链接]
发表于 2011-4-16 13:11:29 | 显示全部楼层 |阅读模式
本帖最后由 kevinch 于 2011-4-17 13:05 编辑

在vbs正则里有submatches用法,对于无法单独提取的字符串可以提取一段然后再提取其子段,不知道au3是否也可以这样使用,能给个小例子吗?
发表于 2011-4-16 14:07:59 | 显示全部楼层
本帖最后由 mozha 于 2011-4-16 14:09 编辑

FileReadLine
$file = FileOpen("test.txt", 0)

; 检查打开的文件是否可读
If $file = -1 Then
    MsgBox(0, "错误", "不能打开文件.")
    Exit
EndIf

; 每次读取一行文本,直到文件结束.
While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    MsgBox(0, "读取的行:", $line)
Wend

FileClose($file)
发表于 2011-4-16 14:14:26 | 显示全部楼层
回复 1# kevinch
给段字符串看看,不是很懂你的意思,我暂时没遇到不可正则提取的例子
 楼主| 发表于 2011-4-16 14:31:54 | 显示全部楼层
比如:
25个人每人60块,50个人每人70块
如果这种在vbs正则里可以直接用"(\d+).*?(\d+)"匹配,并用submatches(0)匹配提取出第一个数字,submatches(1)匹配提取出第二个数字,从而实现计算功能,不知au3能否类似这样实现?
发表于 2011-4-16 16:53:48 | 显示全部楼层
通配你需要的数字,得到的数组不就是你要的?比如提取70跟60,可以(\d+)块   这样得到的数组不是你要计算的?
发表于 2011-4-16 16:56:50 | 显示全部楼层
#include <array.au3>
$a='25个人每人60块,50个人每人70块'
$b=StringRegExp($a,'(\d+)块',3)
 _ArrayDisplay($b)

评分

参与人数 1金钱 +10 收起 理由
kevinch + 10 谢谢

查看全部评分

 楼主| 发表于 2011-4-16 17:13:18 | 显示全部楼层
回复 5# love5173
主要是这个功能不错,不知道au3支持这个功能不
发表于 2011-4-16 17:20:53 | 显示全部楼层
这个是捕获组 请参考相关的函数
发表于 2011-4-16 19:18:48 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-4-16 20:39 编辑

回复 4# kevinch

写个用户定义函数不行吗?
$str = '25个人每人60块,50个人每人70块'

$a = _StringRegExp_SubMatches($str, '(\d+).*?(\d+)', 0)
MsgBox(0, '', $a)

Func _StringRegExp_SubMatches($string, $regex, $num)
        $out = StringRegExp($string, $regex, 3)
        Return $out[$num]
EndFunc   ;==>_StringRegExp_SubMatches

评分

参与人数 1金钱 +20 贡献 +3 收起 理由
kevinch + 20 + 3 好主意,创造自己想要的函数

查看全部评分

发表于 2011-4-17 07:35:48 | 显示全部楼层
看看是这效果不
;Perl样式
#include <Array.au3>
Local $sText    = '25个人每人60块,50个人每人70块'
Local $asResult = StringRegExp($sText, '(\d+).*?(\d+)', 4)

If IsArray($asResult) Then
        Local $iCount = UBound($asResult, 1)
        For $i = 0 To $iCount - 1 Step 1
                _ArrayDisplay($asResult[0], "第 " & $i+1 &" 条结果:")
        Next
Else
        Local $iCount = 0
EndIf

$sTips = "发现 " & $iCount & " 条结果:"
For $i = 0 To $iCount - 1 Step 1
        $aTmp   = $asResult[$i]
        $sTips &= @CRLF & $i + 1 & @TAB & $aTmp[0] & @TAB & "合计 = " & $aTmp[1] * $aTmp[2] & " 元"
Next
MsgBox(4096, "结果", $sTips)
Exit
;AutoIt返回样式
#include <Array.au3>
Local $sText    = '25个人每人60块,50个人每人70块'
Local $asResult = StringRegExp($sText, '((\d+).*?(\d+))', 3)

If IsArray($asResult) Then
        Local $iCount = UBound($asResult, 1) / 3
        _ArrayDisplay($asResult, "发现 " & $iCount & " 条结果:")
Else
        Local $iCount = 0
EndIf

$sTips = "发现 " & $iCount & " 条结果:"
For $i = 0 To $iCount - 1 Step 1
        $sTips &= @CRLF & $i + 1 & @TAB & $asResult[3 * $i] & @TAB & "合计 = " & $asResult[3 * $i + 1] * $asResult[3 * $i + 2] & " 元"
Next
MsgBox(4096, "结果", $sTips)
Exit

评分

参与人数 1金钱 +20 收起 理由
kevinch + 20 虽然不是我想要的效果,但是非常感谢你的认 ...

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-2 08:20 , Processed in 0.095900 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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