(已解决)请 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 http://www.autoitx.com/images/common/back.gif
表述不清吗? 本帖最后由 131738 于 2012-3-15 18:08 编辑
回复 2# afan
Global $aWinAPIEx
$aWinAPIEx
$aWinAPIEx =
$aWinAPIEx =
$aWinAPIEx
$aWinAPIEx =
$aWinAPIEx
是定义的数组! 因为不了解全部过程,看着费劲
直接说“什么”要替换成“什么样”吧 因为不了解全部过程,看着费劲
直接说“什么”要替换成“什么样”吧
afan 发表于 2012-3-15 18:08 http://www.autoitx.com/images/common/back.gif
用 数组索引 的 文本替换 数组索引 的文本
为文件路径 太深奥了{:1_267:} 回复 5# afan
或者说直接用 正则替换函数 StringRegExpReplace 函数
完全不使用 _ReplaceStringInFile 函数 太深奥了
zldfsz 发表于 2012-3-15 18:13 http://www.autoitx.com/images/common/back.gif
取笑了。。。呵呵。。。。 回复 2# afan
在我的 WinAPIEx3.7 文档中看看这个函数 _WinAPI_ShellGetStockIconInfo 第二参数的第一个参数值的汉化结果 回复 10# 131738
我大概看懂了意思,稍等 回复131738
我大概看懂了意思,稍等
afan 发表于 2012-3-15 18:24 http://www.autoitx.com/images/common/back.gif
不忙, 慢慢来,不急的,谢谢!!! 看了半天,感觉逻辑上有问题。
按理说一个文件应该全部数组轮询替换完了之后一次写入,而你这个似乎在数组轮询时都要重复判断文件,也就是每替换一次都要重新写过, 改了下,效率等级应该高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 一次写入也没用,因为第二次的字符真好是第一次字符的部分,我觉得这里要加个排除,不会,看Afan表演
反过来想如果用到排除了,那自动替换(看到楼主的那么大的数组想到的)可能也失去意义了