131738 发表于 2012-3-15 17:35:27

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

本帖最后由 131738 于 2012-3-18 16:39 编辑

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

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

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

$aWinAPIEx = '        $SHGSI_ICON'        ;原文本
$aWinAPIEx = '        $SHGSI_ICON --- $tagSHSTOCKICONINFO 结构的 iIcon 成员接收请求的图标句柄.'        ;替换文本
$aWinAPIEx = @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] = "" Then
                        ContinueLoop
                ElseIf Not StringInStr($aWinAPIEx[$k], Chr(32)) And _
                       Not StringInStr($aWinAPIEx[$k], Chr(9)) Then ; 如果被替换字符串不含空格 或 制表符,则 正则替换
                        If StringInStr($aWinAPIEx[$k], "<i>") Or _
                                StringRight($aWinAPIEx[$k], 1) = ">" Or _
                                StringInStr($aWinAPIEx[$k], "$", 0, 1) Or _
                                StringRight($aWinAPIEx[$k], 1) <> "." Then
                                $Test = _ReplaceStringInFile($aWinAPIEx[$k], $aWinAPIEx[$k], $aWinAPIEx[$k], 0, 0);替换 htm 文件
                                If @error Or $Test = 0 Then _Write_Error($k, $aWinAPIEx[$k]);拆分路径,提取文件名,写失败记录                               
                        Else
                                $Str = String(FileRead($aWinAPIEx[$k]))
                                $Test = StringRegExpReplace($Str, '(?m)^' & $aWinAPIEx[$k] & '(?=[\r\n])', $aWinAPIEx[$k], 1)
                                If @error Or $Test = 0 Then _Write_Error($k, $aWinAPIEx[$k]);拆分路径,提取文件名,写失败记录
                        EndIf
                Else
                        $Test = _ReplaceStringInFile($aWinAPIEx[$k], $aWinAPIEx[$k], $aWinAPIEx[$k], 0, 0);替换 htm 文件
                        If @error Or $Test = 0 Then _Write_Error($k, $aWinAPIEx[$k]);拆分路径,提取文件名,写失败记录
                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 成员接收请求的图标句柄. }
应是脚本执行数组索引 的结果,

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

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

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

afan 发表于 2012-3-15 18:00:32

没看懂啊

131738 发表于 2012-3-15 18:03:39

没看懂啊
afan 发表于 2012-3-15 18:00 http://www.autoitx.com/images/common/back.gif

表述不清吗?

131738 发表于 2012-3-15 18:07:27

本帖最后由 131738 于 2012-3-15 18:08 编辑

回复 2# afan

Global $aWinAPIEx

$aWinAPIEx
$aWinAPIEx =
$aWinAPIEx =
$aWinAPIEx
$aWinAPIEx =
$aWinAPIEx

是定义的数组!

afan 发表于 2012-3-15 18:08:38

因为不了解全部过程,看着费劲
直接说“什么”要替换成“什么样”吧

131738 发表于 2012-3-15 18:12:06

因为不了解全部过程,看着费劲
直接说“什么”要替换成“什么样”吧
afan 发表于 2012-3-15 18:08 http://www.autoitx.com/images/common/back.gif

用 数组索引 的 文本替换 数组索引 的文本
为文件路径

zldfsz 发表于 2012-3-15 18:13:59

太深奥了{:1_267:}

131738 发表于 2012-3-15 18:16:39

回复 5# afan

或者说直接用 正则替换函数 StringRegExpReplace 函数
完全不使用 _ReplaceStringInFile 函数

131738 发表于 2012-3-15 18:19:53

太深奥了
zldfsz 发表于 2012-3-15 18:13 http://www.autoitx.com/images/common/back.gif

取笑了。。。呵呵。。。。

131738 发表于 2012-3-15 18:23:46

回复 2# afan

在我的 WinAPIEx3.7 文档中看看这个函数 _WinAPI_ShellGetStockIconInfo 第二参数的第一个参数值的汉化结果

afan 发表于 2012-3-15 18:24:29

回复 10# 131738


    我大概看懂了意思,稍等

131738 发表于 2012-3-15 18:25:45

回复131738


    我大概看懂了意思,稍等
afan 发表于 2012-3-15 18:24 http://www.autoitx.com/images/common/back.gif

不忙, 慢慢来,不急的,谢谢!!!

afan 发表于 2012-3-15 18:56:57

看了半天,感觉逻辑上有问题。
按理说一个文件应该全部数组轮询替换完了之后一次写入,而你这个似乎在数组轮询时都要重复判断文件,也就是每替换一次都要重新写过,

afan 发表于 2012-3-15 19:19:01

改了下,效率等级应该高N倍Global $aWinAPIEx

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

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

_UDF1()

Func _UDF1();定向搜索文本体会
        Local $k, $i, $s0, $sFile
        For $k = 0 To UBound($aWinAPIEx) - 1
                $sFile = $aWinAPIEx[$k]
                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] = '' Or $aWinAPIEx[$i] <> $sFile Then ContinueLoop
                        $s0 = StringRegExpReplace($aWinAPIEx[$i], '^\h*|\h*$', '')
                        $Str = StringRegExpReplace($Str, '(?m)^\h*\Q' & $s0 & '\E\h*(?=\v|$)', $aWinAPIEx[$i], 1)
                Next
                If $Str = $Str1 Then ContinueLoop ;未替换一次
                Local $hFO = FileOpen($sFile, 2)
                FileWrite($hFO, $Str)
                FileClose($hFO)
        Next
EndFunc   ;==>_UDF1

seniors 发表于 2012-3-15 19:20:49

一次写入也没用,因为第二次的字符真好是第一次字符的部分,我觉得这里要加个排除,不会,看Afan表演
反过来想如果用到排除了,那自动替换(看到楼主的那么大的数组想到的)可能也失去意义了
页: [1] 2 3 4 5 6
查看完整版本: (已解决)请 afan 帮助修改正则替换代码, 谢谢!