[已解决]再请 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 - 测试”为主工作目录,
其余为这个目录供替换的副本。
两个忽视的问题
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 另外,如果你在函数中 $Error_Txt = FileOpen(@ScriptDir & "\Error.txt", 1)
最好也在函数最后加上 FileClose($Error_Txt)
判断错误信息时直接写文件就行了
FileWriteLine(@ScriptDir & "\Error.txt", '==============' & ' 失败: ' & $Error_count & ' ==============') 两个忽视的问题
1,大小写。2,源字符串含有“\e”字符,不适合\Q \E,表达式。
现已修改ok
afan 发表于 2012-3-21 14:41 http://www.autoitx.com/images/common/back.gif
神啊!谢谢了!!! 神啊!谢谢了!!!
131738 发表于 2012-3-21 14:59 http://www.autoitx.com/images/common/back.gif
重组脚本,忘记了,谢谢!!! 平均 1 秒钟查找、替换并修改 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 平均 1 秒钟查找、替换并修改 15 个文件,算可以了,呵呵~
afan 发表于 2012-3-21 15:16 http://www.autoitx.com/images/common/back.gif
已经很神速了,840 个文件,大约 13350 行替换,56 秒! 840 个文件,大约 13350 行替换,56 秒!
感觉有点酷啊! 看了下前辈提供的文件,貌似都是以行为单位,比较规则,就用 StringReplace 可能会快一丁点,当然,不知道是 ...
afan 发表于 2012-3-21 15:29 http://www.autoitx.com/images/common/back.gif
这个我再研究下,虽然不用正则,因为存在英文单词行,
比如; String,这个单词在字符串函数的 .txt 文件中首先在函数名称中,这是不能替换的!
要求往下搜索参数名为 ' String '的替换为 ' 字符串 ', 但不知 StringReplace 是否执行这样的完全匹配? 这个我再研究下,虽然不用正则,因为存在英文单词行,
比如; String,这个单词在字符串函数的 .txt 文 ...
131738 发表于 2012-3-21 16:02 http://www.autoitx.com/images/common/back.gif
这样的话可以肯定 StringReplace 是不能胜任的,不用研究了~ 这样的话可以肯定 StringReplace 是不能胜任的,不用研究了~
afan 发表于 2012-3-21 16:26 http://www.autoitx.com/images/common/back.gif
OK,谢谢!!! 两个忽视的问题
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 句编辑索引为 和 今天使用这段代码汉化 3.3.9.3 文档,发现 2 的问题:
1 . 比喻 3.3.9.2 文档的数组总计
...
131738 发表于 2012-4-9 18:54 http://www.autoitx.com/images/common/back.gif
不懂,前辈是有新问题吗? 不懂,前辈是有新问题吗?
afan 发表于 2012-4-9 18:57 http://www.autoitx.com/images/common/back.gif
奇怪了。。。本来是准备请教有关正则的,想想我自己迂回解决算了的,
写了一半,我直接关闭了窗口,没有点击发表按钮!
以前这种情况也是这样处理的,不会放出来的,这次不知为何却放出来了。。。抱歉!!!
页:
[1]
2