如何删除代码中的所有用";"号注释的内容?[已解决]
本帖最后由 cashiba 于 2017-3-18 09:25 编辑Local $sFileOpenDialog = FileOpenDialog($sMessage, _;启动浏览文件夹对话框.
@WindowsDir & "\", _
"图像文件 (*.jpg;*.bmp)|视频文件 (*.avi;*.mpg)", _
$FD_FILEMUSTEXIST + $FD_MULTISELECT)
If @error Then ;提示错误.
想用正则删除注释内容(?m);.*?$[\n|\r]?首尾的注释都能正确识别
但是代码中间的非注释带;号的没法排除掉
对正则不是太熟,希望正则大神们指点....
{:face (288):} 因为分号除了注释外只在引号中使用,所以(?m);[^'"]*?$[\n|\r]?就可以了 感谢指点!忘记排除的写法了,原来是);[^'"]
如果注释里也有引号呢?要再怎么修改一下? 另外,删除空白行用什么符号呢,
比喻说要删除空白行,段落之间只有一个空白行的不删除,有连续两个以上的空白行的只保留一行
想弄一个简单的处理示例源码的代码,删除那些过多的注释,弄得整齐一些方便看,所以要用到正则了
{:face (332):} (?m)^[\s][\n\r]?$(?m)^[\s| ]*\r\n$这个删除空白行貌似可以..... 学习了,正则一直觉得很难 Local $sFileOpenDialog = FileOpenDialog($sMessage, _;启动浏览文件夹对话框.
@WindowsDir & "\", _
"图像文件 (*.jpg;*.bmp)|视频文件 (*.avi;*.mpg)", _ ;;是这里有两个"分号";和'引号';怎么办呢.
$FD_FILEMUSTEXIST + $FD_MULTISELECT);这里是样式+扩展样式
If @error Then ;启动"浏览"文件夹.复杂点的不知道怎么写正则了......
{:face (396):} 路过学习一下 {:face (332):} 本帖最后由 tubaba 于 2017-2-24 09:16 编辑
去年编写过一个脚本迷惑工具,论坛研究这个的不多,我用的办法比较笨,正则运用不够熟练.我是这么操作的,下面三个函数是处理区域注释以及空行..希望可以帮到你
_ScriptPretreatment($sPath, $Flag = 0, $EncodeMode = 512) ;脚本预处理
If $StopFlag = True Then Return SetError(1, 0, False)
If $Flag Then _GUICtrlListView_SetItemText($hTab3_ListView1, 1, '正在执行', 2)
If $LogFlag Then _Log('正在进行脚本预处理...')
Local $hFile = FileOpen($sPath)
Local $sSource = FileRead($hFile)
FileClose($hFile)
Local $TempLineStr = $sSource
Local $Pattern3 = '(?<!\r)\n' ;处理换行
Local $Pattern1 = '(' & "'|" & '")(.*?)(\1)' ;成对引号
Local $Pattern2 = '([\x1c|\x1d]+)(\x02\x22|\x02\x27)'
Local $Pattern4 = '(\[[^\[\],]*)(,)' ;中括号内的逗号替换为chr(1)
$TempLineStr = StringRegExpReplace($TempLineStr, $Pattern3, @CRLF)
$TempLineStr = StringReplace(StringReplace($TempLineStr, Chr(39) & Chr(39), Chr(29)), Chr(34) & Chr(34), Chr(28)) ;相邻双引号或单引号替换其它符号,为下步做准备
$TempLineStr = StringRegExpReplace($TempLineStr, $Pattern1, Chr(2) & '${1}${2}${3}' & Chr(3)) ;加入字符串起止标志
$TempLineStr = StringRegExpReplace($TempLineStr, $Pattern2, '${2}${1}') ;将起始标志前的成对相邻双引号或成对相邻单引号移动到起始标志后
Local $n = 0
Do
$n += 1
If $StopFlag = True Then Return SetError(1, 0, False)
$TempLineStr = StringRegExpReplace($TempLineStr, $Pattern4, '${1}' & Chr(1)) ;中括号内的逗号替换为chr(1)
Until @error = 0 And @extended = 0
Local $hFile = FileOpen($sPath, 2 + $EncodeMode)
FileWrite($hFile, $TempLineStr)
FileClose($hFile)
If $Flag Then _GUICtrlListView_SetItemText($hTab3_ListView1, 1, '已完成', 2)
EndFunc ;==>_ScriptPretreatment
Func _RemoveFromScript($sOutPath, $Flag = 0, $EncodeMode = 512)
If $StopFlag = True Then Return SetError(1, 0, False)
_FilePretreatment($sOutPath, $Flag, $EncodeMode, 0) ;去除注释
If $StopFlag = True Then Return SetError(1, 0, False)
_FilePretreatment($sOutPath, $Flag, $EncodeMode, 1) ;去除空行
If $StopFlag = True Then Return SetError(1, 0, False)
EndFunc ;==>_RemoveFromScript
Func _FilePretreatment($sInPutFilePath, $MFlag, $EncodeMode, $Flag)
If $StopFlag = True Then Return SetError(1, 0, False)
Local $hFile = FileOpen($sInPutFilePath)
Local $sStr = FileRead($hFile)
FileClose($hFile)
Switch $Flag
Case 0 ;去除注释
If $MFlag Then _GUICtrlListView_SetItemText($hTab3_ListView1, 2, '正在执行', 2)
If $LogFlag Then _Log('正在清除区域注释...')
GUICtrlSetData($Label1, '正在清除区域注释...')
Local $Pattern1 = '(?m)(?<=^)\h*;.*(\r\n)|(?<=^)\h*;.*' ;开头是";"的行去除
$sStr = StringRegExpReplace($sStr, $Pattern1, '')
Local $aRead = StringSplit($sStr, @CRLF, 1 + 2)
Local $Pattern2 = '(.*?)(\h*;.*)'
Local $Pattern3 = '\x02[^\x02\x03]+?\x03'
Local $Pattern4 = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
Local $Pattern5 = '(?s)(?i)(?:\r?\n\h*#cs|\r?\n\h*#comments-start).+?(?:(?:\r?\n\h*#cs|\r?\n\h*#comments-start).+?(?:\r?\n\h*#ce|\r?\n\h*#comments-end))*(?:\s*(?:\r?\n\h*#ce|\r?\n\h*#comments-end))+[^\r\n]*\r?\n' ;区域注释
Local $CountLine = UBound($aRead)
For $i = 0 To UBound($aRead) - 1
If $StopFlag = True Then Return SetError(1, 0, False)
Local $TempLineStr = $aRead[$i], $TempStr, $SerchStr = ''
If StringRegExp($TempLineStr, $Pattern3) Then
$TempLineStr = StringRegExpReplace($TempLineStr, $Pattern4, '\\${1}') ;转义特殊字符
$TempLineStr = StringRegExpReplace($TempLineStr, $Pattern3, '\\x02.+?\\x03') ;替换为表达式
$SerchStr = StringRegExpReplace($TempLineStr, $Pattern2, '${2}')
If @extended Then $aRead[$i] = StringRegExpReplace($aRead[$i], $SerchStr, '')
Else
$SerchStr = StringRegExpReplace($aRead[$i], $Pattern2, '${2}')
If @extended Then $aRead[$i] = StringReplace($aRead[$i], $SerchStr, '', -1, 1)
EndIf
If $MFlag And Mod($i, 50) = 0 Then _GUICtrlListView_SetItemText($hTab3_ListView1, 2, '已完成' & Chr(32) & $i & '/' & $CountLine, 2)
Next
$hFile = FileOpen($sInPutFilePath, 2 + $EncodeMode)
FileWriteLine($hFile, $sHead)
For $i = 0 To UBound($aRead) - 1
FileWriteLine($hFile, $aRead[$i])
Next
FileClose($hFile)
_GUICtrlListView_SetItemText($hTab3_ListView1, 2, '正在清除区域注释...', 2)
Local $hFile = FileOpen($sInPutFilePath)
Local $sStr = FileRead($hFile)
FileClose($hFile)
$sStr = StringRegExpReplace(@CRLF & $sStr, $Pattern5, @CRLF)
$hFile = FileOpen($sInPutFilePath, 2 + $EncodeMode)
FileWrite($hFile, $sStr)
FileClose($hFile)
If $MFlag Then _GUICtrlListView_SetItemText($hTab3_ListView1, 2, '已完成', 2)
GUICtrlSetData($Label1, '清除完成...')
Case 1 ;去除空行
If $MFlag Then _GUICtrlListView_SetItemText($hTab3_ListView1, 3, '正在执行', 2)
If $LogFlag Then _Log('正在清除空行及行首行未空白字符...')
GUICtrlSetData($Label1, '正在清除空行及行首行未空白字符...')
Local $Pattern1 = '(?m)(?<=^)\h*(.+)'
Local $Pattern2 = '(?<!\r)\n' ;处理换行
Local $Pattern3 = '\r\n(?=\r\n)|\r\n$'
Local $Pattern4 = '^\r\n'
$sStr = StringRegExpReplace($sStr, $Pattern1, '${1}') ;删除行首空白符
$sStr = StringRegExpReplace($sStr, $Pattern2, @CRLF)
$sStr = StringRegExpReplace(@CRLF & $sStr, $Pattern3, '') ;删除空行
$sStr = StringRegExpReplace($sStr, $Pattern4, '') ;删除空行
$hFile = FileOpen($sInPutFilePath, 2 + $EncodeMode)
FileWrite($hFile, $sStr)
FileClose($hFile)
If $MFlag Then _GUICtrlListView_SetItemText($hTab3_ListView1, 3, '已完成', 2)
GUICtrlSetData($Label1, '清除完成...')
EndSwitch
EndFunc ;==>_FilePretreatment
有现成的
A大的 AuMerger 去年编写过一个脚本迷惑工具,论坛研究这个的不多,我用的办法比较笨,正则运用不够熟练.我是这么操作的,下面三 ...
tubaba 发表于 2017-2-24 09:15 http://www.autoitx.com/images/common/back.gif
非常感谢.....
殊途同归,最后都是用正则达到目的,每种方法都有精彩之处.
比喻,下面的这句binghc大侠的正则也能很好的达到去除注释的目的:
(?m)(?<=^);.*|(".*?")|(?<!^)\s*;[^\r]+|(?s)#cs(?:(?!#ce).)*#ce 有现成的
A大的 AuMerger
lin6051 发表于 2017-2-24 17:47 http://www.autoitx.com/images/common/back.gif
A大的不知道用的什么正则语句.... 本帖最后由 tubaba 于 2017-3-1 09:07 编辑
回复 11# cashiba
要考虑到所有情况,试试清除下面这种嵌套的区域注释结构,记得好象也是Afan版主出的题,从下面的代码高亮看出,论坛的高亮模块也是有问题的噢
#cs
msgbox(48, 0, '不该出现的提示0')
#ce
msgbox(0, 0, 'ok1')
#cs
#include <Array.au3>
msgbox(48, 0, '不该出现的提示1')
#ce
msgbox(0, 0, 'ok2')
#cs
msgbox(48, 0, '不该出现的提示2')
#cs
msgbox(48, 0, '不该出现的提示3')
#ce
msgbox(48, 0, '不该出现的提示4')
#cs
msgbox(48, 0, '不该出现的提示5')
#ce
#ce
msgbox(0, 0, 'ok3') 回复cashiba
要考虑到所有情况,试试清除下面这种嵌套的区域注释结构,记得好象也是Afan版主出的 ...
tubaba 发表于 2017-3-1 09:06 http://www.autoitx.com/images/common/back.gif
现在只是抽空零零碎碎的学AU3,偶尔用用简单的,还没来得及好好看正则,好多看不懂......
{:face (319):} 偶尔用用简单的,还没来得及好好看正则
页:
[1]