找回密码
 加入
搜索
查看: 6402|回复: 18

[AU3基础] [已解决]再请 afan 帮助解决正则替换问题,谢谢!!!

  [复制链接]
发表于 2012-3-21 13:28:52 | 显示全部楼层 |阅读模式
本帖最后由 131738 于 2012-3-21 16:09 编辑

感谢正则圣手 afan, 神速解决!

上次给的两个替换代码,While 循环代码比 For 嵌套循环代码快近一倍,
840 个文件由 1 分 46 秒提速到 53 秒!

这次以上传附件形式求助,附件解压后,请直接运行 APIEx_Test\汉化-WinAPIEx_测试用.au3 脚本,

运行完成后自动弹出失败记录:分别为数组索引 [56],[57],[61],[84],[85],

已排除数组中替换失败的文本与原 .txt 文件的文本格式差异! 这 5 条文本分别用 2 个替换代码均失败!

以前用 _ReplaceStringInFile() 函数, 这 5 条文本正确替换,

估计是正则表达式的问题,请帮忙分析一下,谢谢!!!

附件的 APIEx_Test\txt2htm 文件夹中,“txtlibfunctions - 测试”为主工作目录,
其余为这个目录供替换的副本。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +15 收起 理由
afan + 15 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2012-3-21 14:41:29 | 显示全部楼层
两个忽视的问题
1,大小写。2,源字符串含有“\e”字符,不适合\Q \E,表达式。
现已修改ok
Func _UDF1()
        $Error_Txt = FileOpen(@ScriptDir & "\Error.txt", 1)
        FileWriteLine($Error_Txt, @YEAR & "/" & @MON & "/" & @MDAY & "---" & @HOUR & ":" & @MIN)
        FileWriteLine($Error_Txt, "-------------- WinAPIEx 函数替换失败记录 -------------------")
        
        Local $k, $s0, $sFile, $iMax = UBound($aWinAPIEx) - 1
        For $k = 0 To $iMax
                If $aWinAPIEx[$k][0] = '' Then ContinueLoop
                $sFile = $Txt_path & $aWinAPIEx[$k][2] ;当前处理的文件
                Local $Str = String(FileRead($sFile)), $Str1 = $Str
                While 1
                        $s1 = StringRegExpReplace($aWinAPIEx[$k][1], '\${|\$\d+|\\', '\\$0')
                        If StringInStr($aWinAPIEx[$k][0], '\e') Then
                                $s0 = StringRegExpReplace($aWinAPIEx[$k][0], '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1') ;转义
                                $Str = StringRegExpReplace($Str, '(?mi)^\h*' & $s0 & '\h*(?=\v|$)', $s1, 1)
                        Else
                                $s0 = StringRegExpReplace($aWinAPIEx[$k][0], '^\h*|\h*$', '')
                                $Str = StringRegExpReplace($Str, '(?mi)^\h*\Q' & $s0 & '\E\h*(?=\v|$)', $s1, 1)
                        EndIf
                        If Not @Error And @Extended = 0 Then
                                FileWriteLine($Error_Txt, "$aWinAPIEx[" & $k & "][0] = '" & $aWinAPIEx[$k][2] & "'")
                                $Error_count += 1
                        EndIf
                        If ($k = $iMax) Or ($aWinAPIEx[$k + 1][2] <> $sFile) Then ExitLoop ;如果下一个文件不是当前文件则退出该文件的全部操作
                        $k += 1 ;为了接着处理当前文件的下一组数据,不会多余的循环
                WEnd
                If $Str = $Str1 Then ContinueLoop ;未替换一次
                Local $hFO = FileOpen($sFile, 2)
                FileWrite($hFO, $Str)
                FileClose($hFO)
        Next
EndFunc   ;==>_UDF1
发表于 2012-3-21 14:53:10 | 显示全部楼层
另外,如果你在函数中 $Error_Txt = FileOpen(@ScriptDir & "\Error.txt", 1)
最好也在函数最后加上 FileClose($Error_Txt)

判断错误信息时直接写文件就行了
FileWriteLine(@ScriptDir & "\Error.txt", '==============' & ' 失败: ' & $Error_count & ' ==============')
 楼主| 发表于 2012-3-21 14:59:57 | 显示全部楼层
两个忽视的问题
1,大小写。2,源字符串含有“\e”字符,不适合\Q \E,表达式。
现已修改ok
afan 发表于 2012-3-21 14:41


神啊!谢谢了!!!
 楼主| 发表于 2012-3-21 15:00:41 | 显示全部楼层
神啊!谢谢了!!!
131738 发表于 2012-3-21 14:59


重组脚本,忘记了,谢谢!!!
发表于 2012-3-21 15:16:10 | 显示全部楼层
平均 1 秒钟查找、替换并修改 15 个文件,算可以了,呵呵~
发表于 2012-3-21 15:29:15 | 显示全部楼层
看了下前辈提供的文件,貌似都是以行为单位,比较规则,就用 StringReplace 可能会快一丁点,当然,不知道是否保险,因为不了解全部的文件
                While 1
                        $Str = StringReplace($Str, $aWinAPIEx[$k][0], $aWinAPIEx[$k][1], 1)
                        If @Extended = 0 Then
                                FileWriteLine($Error_Txt, "$aWinAPIEx[" & $k & "][0] = '" & $aWinAPIEx[$k][2] & "'")
                                $Error_count += 1
                        EndIf
                        If ($k = $iMax) Or ($aWinAPIEx[$k + 1][2] <> $sFile) Then ExitLoop ;如果下一个文件不是当前文件则退出该文件的全部操作
                        $k += 1 ;为了接着处理当前文件的下一组数据,不会多余的循环
                WEnd
 楼主| 发表于 2012-3-21 15:49:32 | 显示全部楼层
平均 1 秒钟查找、替换并修改 15 个文件,算可以了,呵呵~
afan 发表于 2012-3-21 15:16


已经很神速了,840 个文件,大约 13350 行替换,56 秒!
发表于 2012-3-21 15:50:56 | 显示全部楼层
840 个文件,大约 13350 行替换,56 秒!
感觉有点酷啊!
 楼主| 发表于 2012-3-21 16:02:30 | 显示全部楼层
看了下前辈提供的文件,貌似都是以行为单位,比较规则,就用 StringReplace 可能会快一丁点,当然,不知道是 ...
afan 发表于 2012-3-21 15:29


这个我再研究下,虽然不用正则,因为存在英文单词行,
比如; String,这个单词在字符串函数的 .txt 文件中首先在函数名称中,这是不能替换的!
要求往下搜索参数名为 ' String '的替换为 ' 字符串 ', 但不知 StringReplace 是否执行这样的完全匹配?
发表于 2012-3-21 16:26:22 | 显示全部楼层
这个我再研究下,虽然不用正则,因为存在英文单词行,
比如; String,这个单词在字符串函数的 .txt 文 ...
131738 发表于 2012-3-21 16:02



    这样的话可以肯定 StringReplace 是不能胜任的,不用研究了~
 楼主| 发表于 2012-3-21 16:30:59 | 显示全部楼层
这样的话可以肯定 StringReplace 是不能胜任的,不用研究了~
afan 发表于 2012-3-21 16:26


OK,谢谢!!!
 楼主| 发表于 2012-4-9 18:54:48 | 显示全部楼层
两个忽视的问题
1,大小写。2,源字符串含有“\e”字符,不适合\Q \E,表达式。
现已修改ok
afan 发表于 2012-3-21 14:41


今天使用这段代码汉化 3.3.9.3 文档,发现 2 的问题:
1 . 比喻 3.3.9.2 文档的数组总计 [6000]
     Static.txt 的内容在原数组 [250] 到 [260],
     现在新版文档的 Static.txt 添加 2 句新内容,
     将这 2 句编辑索引为 [6001] 和 [6002]
发表于 2012-4-9 18:57:22 | 显示全部楼层
今天使用这段代码汉化 3.3.9.3 文档,发现 2 的问题:
1 . 比喻 3.3.9.2 文档的数组总计 [6000]
     ...
131738 发表于 2012-4-9 18:54



    不懂,前辈是有新问题吗?
 楼主| 发表于 2012-4-9 19:42:09 | 显示全部楼层
不懂,前辈是有新问题吗?
afan 发表于 2012-4-9 18:57


奇怪了。。。本来是准备请教有关正则的,想想我自己迂回解决算了的,
写了一半,我直接关闭了窗口,没有点击发表按钮!
以前这种情况也是这样处理的,不会放出来的,这次不知为何却放出来了。。。抱歉!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-30 15:22 , Processed in 0.098628 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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