找回密码
 加入
搜索
查看: 22514|回复: 78

[AU3基础] (已解决)请 afan 帮助修改正则替换代码, 谢谢!

 火... [复制链接]
发表于 2012-3-15 17:35:27 | 显示全部楼层 |阅读模式
本帖最后由 131738 于 2012-3-18 16:39 编辑

谢谢超版 afan 的热心帮助!!!此问题得以解决!

原 a.txt 文件(问题相关部分) 这两行文本的前 11 个字符相同
        $SHGSI_ICONLOCATION
        $SHGSI_ICON
下面是替换程序的脚本(问题相关部分):
Global $aWinAPIEx[8891][3]

$aWinAPIEx[72][0] = '        $SHGSI_ICONLOCATION'        ;原文本
$aWinAPIEx[72][1] = '        $SHGSI_ICONLOCATION --- $tagSHSTOCKICONINFO 结构的 szPath 与 iIcon 成员接收请求的请求的路径和图标.'        ;替换文本
$aWinAPIEx[72][2] = @ScriptDir & '\txt2htm\txtlibfunctions\A.TXT'        ;文件路径

$aWinAPIEx[73][0] = '        $SHGSI_ICON'        ;原文本
$aWinAPIEx[73][1] = '        $SHGSI_ICON --- $tagSHSTOCKICONINFO 结构的 iIcon 成员接收请求的图标句柄.'        ;替换文本
$aWinAPIEx[73][2] = @ScriptDir & '\txt2htm\txtlibfunctions\A.TXT'        ;文件路径

_UDF1()

Func _UDF1();定向搜索文本体会        
        $Error_Txt = FileOpen(@ScriptDir & "\Error.txt", 1)
        FileWriteLine($Error_Txt, @YEAR & "/" & @MON & "/" & @MDAY & "---" & @HOUR & ":" & @MIN)
        FileWriteLine($Error_Txt, "-------------- WinAPIEx 替换失败记录 -------------------")
        For $k = 0 To UBound($aWinAPIEx) - 1
                ProgressSet(Round($Step*$k), Round($Step*$k, 2) & " %");修改进度
                If $aWinAPIEx[$k][0] = "" Then
                        ContinueLoop
                ElseIf Not StringInStr($aWinAPIEx[$k][0], Chr(32)) And _
                         Not StringInStr($aWinAPIEx[$k][0], Chr(9)) Then ; 如果被替换字符串不含空格 或 制表符,则 正则替换
                        If StringInStr($aWinAPIEx[$k][0], "<i>") Or _
                                StringRight($aWinAPIEx[$k][0], 1) = ">" Or _
                                StringInStr($aWinAPIEx[$k][0], "$", 0, 1) Or _
                                StringRight($aWinAPIEx[$k][0], 1) <> "." Then
                                $Test = _ReplaceStringInFile($aWinAPIEx[$k][2], $aWinAPIEx[$k][0], $aWinAPIEx[$k][1], 0, 0);替换 htm 文件
                                If @error Or $Test = 0 Then _Write_Error($k, $aWinAPIEx[$k][2]);拆分路径,提取文件名,写失败记录                                
                        Else
                                $Str = String(FileRead($aWinAPIEx[$k][2]))
                                $Test = StringRegExpReplace($Str, '(?m)^' & $aWinAPIEx[$k][0] & '(?=[\r\n])', $aWinAPIEx[$k][1], 1)
                                If @error Or $Test = 0 Then _Write_Error($k, $aWinAPIEx[$k][2]);拆分路径,提取文件名,写失败记录
                        EndIf
                Else
                        $Test = _ReplaceStringInFile($aWinAPIEx[$k][2], $aWinAPIEx[$k][0], $aWinAPIEx[$k][1], 0, 0);替换 htm 文件
                        If @error Or $Test = 0 Then _Write_Error($k, $aWinAPIEx[$k][2]);拆分路径,提取文件名,写失败记录
                EndIf
        Next
        FileWriteLine($Error_Txt, "WinAPIEx 替换失败记录: " & $count)
        ProgressSet(100, "完成", "WinAPIEx 汉化完毕!")
        ProgressOff()        
        FileClose($Error_Txt)
        If $count > 0 Then;如果发生替换错误,
                ShellExecute('Error.txt', "", @ScriptDir & "", "open");打开脚本所在目录的 'Error.txt' 文件查看错误
                Exit
        Else
                Exit
        EndIf
EndFunc   ;==>_ChineseB
脚本执行后, a.txt 文件的结果:
        $SHGSI_ICON --- $tagSHSTOCKICONINFO 结构的 iIcon 成员接收请求的图标句柄.LOCATION --- $tagSHSTOCKICONINFO 结构的 szPath 与 iIcon 成员接收请求的请求的路径和图标.
        $SHGSI_ICON
发生错误:

第一行的前半部分:
{ $SHGSI_ICON --- $tagSHSTOCKICONINFO 结构的 iIcon 成员接收请求的图标句柄. }
应是脚本执行数组索引 [73] 的结果,

第一行的前后部分:
{ LOCATION --- $tagSHSTOCKICONINFO 结构的 szPath 与 iIcon 成员接收请求的请求的路径和图标. }  
应是脚本执行数组索引 [72] 的结果,

因为 _ReplaceStringInFile() 没有完全匹配选项,而且设置为只替换首次被发现的,
所以[73]的替换文本被插入到[72]相同字串的后面了. 使希望替换的第二行文本成为空白!

请帮忙解决这样的问题,谢谢!!!

评分

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

查看全部评分

发表于 2012-3-15 18:00:32 | 显示全部楼层
没看懂啊
 楼主| 发表于 2012-3-15 18:03:39 | 显示全部楼层
没看懂啊
afan 发表于 2012-3-15 18:00


表述不清吗?
 楼主| 发表于 2012-3-15 18:07:27 | 显示全部楼层
本帖最后由 131738 于 2012-3-15 18:08 编辑

回复 2# afan

Global $aWinAPIEx[8891][3]

$aWinAPIEx[72][0]
$aWinAPIEx[72][1] =
$aWinAPIEx[72][2] =
$aWinAPIEx[73][0]
$aWinAPIEx[73][1] =
$aWinAPIEx[73][2]

是定义的数组!
发表于 2012-3-15 18:08:38 | 显示全部楼层
因为不了解全部过程,看着费劲
直接说“什么”要替换成“什么样”吧
 楼主| 发表于 2012-3-15 18:12:06 | 显示全部楼层
因为不了解全部过程,看着费劲
直接说“什么”要替换成“什么样”吧
afan 发表于 2012-3-15 18:08


用 数组索引 [n][1] 的 文本替换 数组索引 [n][0]的文本
[n][2] 为文件路径
发表于 2012-3-15 18:13:59 | 显示全部楼层
太深奥了
 楼主| 发表于 2012-3-15 18:16:39 | 显示全部楼层
回复 5# afan

或者说直接用 正则替换函数 StringRegExpReplace 函数
完全不使用 _ReplaceStringInFile 函数
 楼主| 发表于 2012-3-15 18:19:53 | 显示全部楼层
太深奥了
zldfsz 发表于 2012-3-15 18:13


取笑了。。。呵呵。。。。
 楼主| 发表于 2012-3-15 18:23:46 | 显示全部楼层
回复 2# afan

在我的 WinAPIEx3.7 文档中看看这个函数 _WinAPI_ShellGetStockIconInfo 第二参数的第一个参数值的汉化结果
发表于 2012-3-15 18:24:29 | 显示全部楼层
回复 10# 131738


    我大概看懂了意思,稍等
 楼主| 发表于 2012-3-15 18:25:45 | 显示全部楼层
回复  131738


    我大概看懂了意思,稍等
afan 发表于 2012-3-15 18:24


不忙, 慢慢来,不急的,谢谢!!!
发表于 2012-3-15 18:56:57 | 显示全部楼层
看了半天,感觉逻辑上有问题。
按理说一个文件应该全部数组轮询替换完了之后一次写入,而你这个似乎在数组轮询时都要重复判断文件,也就是每替换一次都要重新写过,
发表于 2012-3-15 19:19:01 | 显示全部楼层
改了下,效率等级应该高N倍
Global $aWinAPIEx[8891][3]

$aWinAPIEx[72][0] = '        $SHGSI_ICONLOCATION' ;原文本
$aWinAPIEx[72][1] = '        $SHGSI_ICONLOCATION --- $tagSHSTOCKICONINFO 结构的 szPath 与 iIcon 成员接收请求的请求的路径和图标.' ;替换文本
$aWinAPIEx[72][2] = @ScriptDir & '\txt2htm\txtlibfunctions\A.TXT' ;文件路径

$aWinAPIEx[73][0] = '        $SHGSI_ICON' ;原文本
$aWinAPIEx[73][1] = '        $SHGSI_ICON --- $tagSHSTOCKICONINFO 结构的 iIcon 成员接收请求的图标句柄.' ;替换文本
$aWinAPIEx[73][2] = @ScriptDir & '\txt2htm\txtlibfunctions\A.TXT' ;文件路径

_UDF1()

Func _UDF1();定向搜索文本体会
        Local $k, $i, $s0, $sFile
        For $k = 0 To UBound($aWinAPIEx) - 1
                $sFile = $aWinAPIEx[$k][2]
                If $sFile = '' Or Not FileExists($sFile) Then ContinueLoop
                Local $Str = String(FileRead($sFile)), $Str1 = $Str
                For $i = 0 To UBound($aWinAPIEx) - 1
                        If $aWinAPIEx[$i][0] = '' Or $aWinAPIEx[$i][2] <> $sFile Then ContinueLoop
                        $s0 = StringRegExpReplace($aWinAPIEx[$i][0], '^\h*|\h*$', '')
                        $Str = StringRegExpReplace($Str, '(?m)^\h*\Q' & $s0 & '\E\h*(?=\v|$)', $aWinAPIEx[$i][1], 1)
                Next
                If $Str = $Str1 Then ContinueLoop ;未替换一次
                Local $hFO = FileOpen($sFile, 2)
                FileWrite($hFO, $Str)
                FileClose($hFO)
        Next
EndFunc   ;==>_UDF1
发表于 2012-3-15 19:20:49 | 显示全部楼层
一次写入也没用,因为第二次的字符真好是第一次字符的部分,我觉得这里要加个排除,不会,看Afan表演
反过来想如果用到排除了,那自动替换(看到楼主的那么大的数组想到的)可能也失去意义了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 22:29 , Processed in 0.093927 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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