131738 发表于 2012-3-21 13:28:52

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

本帖最后由 131738 于 2012-3-21 16:09 编辑

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

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

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

运行完成后自动弹出失败记录:分别为数组索引 ,,,,,

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

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

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

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

afan 发表于 2012-3-21 14:41:29

两个忽视的问题
1,大小写。2,源字符串含有“\e”字符,不适合\Q \E,表达式。
现已修改okFunc _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] = '' Then ContinueLoop
                $sFile = $Txt_path & $aWinAPIEx[$k] ;当前处理的文件
                Local $Str = String(FileRead($sFile)), $Str1 = $Str
                While 1
                        $s1 = StringRegExpReplace($aWinAPIEx[$k], '\${|\$\d+|\\', '\\$0')
                        If StringInStr($aWinAPIEx[$k], '\e') Then
                                $s0 = StringRegExpReplace($aWinAPIEx[$k], '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1') ;转义
                                $Str = StringRegExpReplace($Str, '(?mi)^\h*' & $s0 & '\h*(?=\v|$)', $s1, 1)
                        Else
                                $s0 = StringRegExpReplace($aWinAPIEx[$k], '^\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 & "] = '" & $aWinAPIEx[$k] & "'")
                                $Error_count += 1
                        EndIf
                        If ($k = $iMax) Or ($aWinAPIEx[$k + 1] <> $sFile) Then ExitLoop ;如果下一个文件不是当前文件则退出该文件的全部操作
                        $k += 1 ;为了接着处理当前文件的下一组数据,不会多余的循环
                WEnd
                If $Str = $Str1 Then ContinueLoop ;未替换一次
                Local $hFO = FileOpen($sFile, 2)
                FileWrite($hFO, $Str)
                FileClose($hFO)
        Next
EndFunc   ;==>_UDF1

afan 发表于 2012-3-21 14:53:10

另外,如果你在函数中 $Error_Txt = FileOpen(@ScriptDir & "\Error.txt", 1)
最好也在函数最后加上 FileClose($Error_Txt)

判断错误信息时直接写文件就行了
FileWriteLine(@ScriptDir & "\Error.txt", '==============' & ' 失败: ' & $Error_count & ' ==============')

131738 发表于 2012-3-21 14:59:57

两个忽视的问题
1,大小写。2,源字符串含有“\e”字符,不适合\Q \E,表达式。
现已修改ok
afan 发表于 2012-3-21 14:41 http://www.autoitx.com/images/common/back.gif

神啊!谢谢了!!!

131738 发表于 2012-3-21 15:00:41

神啊!谢谢了!!!
131738 发表于 2012-3-21 14:59 http://www.autoitx.com/images/common/back.gif

重组脚本,忘记了,谢谢!!!

afan 发表于 2012-3-21 15:16:10

平均 1 秒钟查找、替换并修改 15 个文件,算可以了,呵呵~

afan 发表于 2012-3-21 15:29:15

看了下前辈提供的文件,貌似都是以行为单位,比较规则,就用 StringReplace 可能会快一丁点,当然,不知道是否保险,因为不了解全部的文件                While 1
                        $Str = StringReplace($Str, $aWinAPIEx[$k], $aWinAPIEx[$k], 1)
                        If @Extended = 0 Then
                                FileWriteLine($Error_Txt, "$aWinAPIEx[" & $k & "] = '" & $aWinAPIEx[$k] & "'")
                                $Error_count += 1
                        EndIf
                        If ($k = $iMax) Or ($aWinAPIEx[$k + 1] <> $sFile) Then ExitLoop ;如果下一个文件不是当前文件则退出该文件的全部操作
                        $k += 1 ;为了接着处理当前文件的下一组数据,不会多余的循环
                WEnd

131738 发表于 2012-3-21 15:49:32

平均 1 秒钟查找、替换并修改 15 个文件,算可以了,呵呵~
afan 发表于 2012-3-21 15:16 http://www.autoitx.com/images/common/back.gif

已经很神速了,840 个文件,大约 13350 行替换,56 秒!

user3000 发表于 2012-3-21 15:50:56

840 个文件,大约 13350 行替换,56 秒!
感觉有点酷啊!

131738 发表于 2012-3-21 16:02:30

看了下前辈提供的文件,貌似都是以行为单位,比较规则,就用 StringReplace 可能会快一丁点,当然,不知道是 ...
afan 发表于 2012-3-21 15:29 http://www.autoitx.com/images/common/back.gif

这个我再研究下,虽然不用正则,因为存在英文单词行,
比如; String,这个单词在字符串函数的 .txt 文件中首先在函数名称中,这是不能替换的!
要求往下搜索参数名为 ' String '的替换为 ' 字符串 ', 但不知 StringReplace 是否执行这样的完全匹配?

afan 发表于 2012-3-21 16:26:22

这个我再研究下,虽然不用正则,因为存在英文单词行,
比如; String,这个单词在字符串函数的 .txt 文 ...
131738 发表于 2012-3-21 16:02 http://www.autoitx.com/images/common/back.gif


    这样的话可以肯定 StringReplace 是不能胜任的,不用研究了~

131738 发表于 2012-3-21 16:30:59

这样的话可以肯定 StringReplace 是不能胜任的,不用研究了~
afan 发表于 2012-3-21 16:26 http://www.autoitx.com/images/common/back.gif

OK,谢谢!!!

131738 发表于 2012-4-9 18:54:48

两个忽视的问题
1,大小写。2,源字符串含有“\e”字符,不适合\Q \E,表达式。
现已修改ok
afan 发表于 2012-3-21 14:41 http://www.autoitx.com/images/common/back.gif

今天使用这段代码汉化 3.3.9.3 文档,发现 2 的问题:
1 . 比喻 3.3.9.2 文档的数组总计
   Static.txt 的内容在原数组 到 ,
   现在新版文档的 Static.txt 添加 2 句新内容,
   将这 2 句编辑索引为 和

afan 发表于 2012-4-9 18:57:22

今天使用这段代码汉化 3.3.9.3 文档,发现 2 的问题:
1 . 比喻 3.3.9.2 文档的数组总计
   ...
131738 发表于 2012-4-9 18:54 http://www.autoitx.com/images/common/back.gif


    不懂,前辈是有新问题吗?

131738 发表于 2012-4-9 19:42:09

不懂,前辈是有新问题吗?
afan 发表于 2012-4-9 18:57 http://www.autoitx.com/images/common/back.gif

奇怪了。。。本来是准备请教有关正则的,想想我自己迂回解决算了的,
写了一半,我直接关闭了窗口,没有点击发表按钮!
以前这种情况也是这样处理的,不会放出来的,这次不知为何却放出来了。。。抱歉!!!
页: [1] 2
查看完整版本: [已解决]再请 afan 帮助解决正则替换问题,谢谢!!!