正则式替换问题,求助
#include <ButtonConstants.au3>#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <file.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("批量文件编码转换、字符替换", 450, 350, 192, 124)
$path_label = GUICtrlCreateLabel("目录", 20, 20, 30, 30)
$path_input = GUICtrlCreateInput("", 60, 16, 250, 25)
$path_button = GUICtrlCreateButton("指定目录..", 320, 15, 80, 25)
$find_label = GUICtrlCreateLabel("查找", 20, 60, 28, 17)
$find_edit = GUICtrlCreateEdit("", 60, 60, 350, 100)
$reg_check = GUICtrlCreateCheckbox("正则查找、替换", 60, 160, 100, 20)
$replace_lable = GUICtrlCreateLabel("换成", 20, 180, 28, 17)
$replace_edit = GUICtrlCreateEdit("", 60, 180, 350, 100)
$to_utf8_button = GUICtrlCreateButton("转成utf-8", 100, 296, 90, 30)
$to_ansi_button = GUICtrlCreateButton("转成ANSI",200, 296, 90, 30)
$exit_button = GUICtrlCreateButton("退出", 300, 296, 90, 30)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $exit_button
Exit
Case $path_button
$path = FileSelectFolder("遍历目录,包含子目录", "")
GUICtrlSetData($path_input,$path)
Case $to_utf8_button
char_convert_replace(266)
Case $to_ansi_button
char_convert_replace(10)
EndSwitch
WEnd
;批量转换,替换
Func char_convert_replace($codepage)
$get_path = GUICtrlRead($path_input)
$chk_path=FileExists($get_path)
If not $chk_path Then ;检查路径
MsgBox(16,"错误提示","没有选择目录,或者目录不存在!")
Else
$file_type = InputBox("提示","请输入要转换文件的类型,如:html,txt等文本类型。*表示所有文件。"&@CRLF&"主意:转换后,会删除源文件,请主意转换前备份","*")
$array = myFileListToArray_StringReg($get_path,"\."&$file_type&"$")
If $array == 0 Then
MsgBox(16,"错误提示","指定目录找不到指定类型的文件")
Else
;循环数组,转换编码,替换字符
For $i=1 To $array
$check_dir = FileGetSize($array[$i])
If $check_dir >0 Then ;排除目录、空文件
;读取,删除源文件
$file=FileOpen($array[$i])
$get=FileRead($file)
FileClose($file)
FileDelete($array[$i])
;字符替换
$find = GUICtrlRead($find_edit)
$replace = GUICtrlRead($replace_edit)
If StringLen($find) > 0 Then;如果查找字符存在
If GUICtrlRead($reg_check) ==1 Then ;正则替换
$get = StringRegExpReplace($get,$find,$replace)
Else
MsgBox(0,"","我在这里")
$get = StringReplace($get,$find,$replace)
EndIf
EndIf
;生成utf8 文件
$tofile=FileOpen($array[$i],$codepage)
FileWrite($tofile,$get)
FileClose($tofile)
EndIf
Next
MsgBox(0,"提示","文件转换完成")
EndIf
EndIf
EndFunc
;遍历目录,包含子目录
Func myFileListToArray_StringReg($s_dir, $s_filt = ".*?", $i_flag = 0, $b_subdir=True, $s_ex="")
If StringRight($s_dir,1)="\" Then $s_dir = StringTrimRight($s_dir,1)
If $i_flag<1 Or $i_flag>2 Then $i_flag=0;规范
Local $i_step = 40000 ;每$i_step个文件重新定义一次数组大小,当文件很多时,此值就发挥作用
Local $a_return[$i_step+1];初始数组大小,存放共有多少个文件,因为每次一直ReDim很慢的
Local $i_count = 1;记录找到多少个文件$i_count-1
Local $a_dir;初始数组大小,存放共有多少个文件,因为每次一直ReDim很慢的
$a_dir = 1;做到第几个数组,代替递归
$a_dir = $s_dir
$i_dirCount = 1;共有多少个数组,代替递归用的变量
Local $a_dir_temp, $isdir, $a_temp
Local $file, $search
While $a_dir<UBound($a_dir);代替递归
$s_dir = $a_dir[$a_dir]
$a_dir_temp = _FileListToArray($s_dir, "*", 0)
If UBound($a_dir_temp) <= 1 Then
$a_dir += 1
ContinueLoop
EndIf
$i_dirCount = 1
For $i = 1 To UBound($a_dir_temp)-1
;$isdir=DirGetSize($s_dir &"\" & $a_dir_temp[$i])
$isdir = StringInStr(FileGetAttrib($s_dir&"\"&$a_dir_temp[$i]),"D")
If $b_subdir And $isdir>0 Then
_ArrayInsert($a_dir, $a_dir+$i_dirCount, $s_dir &"\"& $a_dir_temp[$i])
$i_dirCount += 1
EndIf
Select
Case $i_flag=1;文件
If $isdir>0 Then ContinueLoop
Case $i_flag=2;目录
If $isdir<=0 Then ContinueLoop
EndSelect
If Not StringRegExp($a_dir_temp[$i], $s_filt, 0) Then ContinueLoop;正则匹配
;这里可加其他条件
If $s_ex<>"" AndStringRegExp($a_dir_temp[$i], $s_ex, 0) Then ContinueLoop;排除文件名
;-------------------------
;-----如果每找到一个文件就执行一个自定义函数,将此处改为自定义函数
If $i_Count +1 > UBound($a_return)-1 Then ReDim $a_return
$a_return[$i_Count] = $s_dir &"\"& $a_dir_temp[$i]
;--------------------------------------
$i_Count += 1
Next
$a_dir += 1
WEnd;代替递归结束
$a_return = $i_count - 1
;-----如果每找到一个文件就执行一个自定义函数,考虑返回 $i_count - 1(即多少个符合条件的文件)
ReDim $a_return[$i_count]
Return $a_return
;---------------------------------------------------------------
EndFunc正则式替换不好用,求帮忙修改 都没看明白代码 想干嘛 楼主这问题发第2次帖了吧。他明显高估了他人的耐心。
给出具体的示例字符串以及想要的结果就好了。放这么多无关的代码! 这段代码是字符替换的,只是正则式方式替换不好用 给出字符串,然后说名要实现的效果就可以了..... 发了这么多码,谁有心思去研究你的码吗?你问的不是实现的方法吗?
页:
[1]