elexy 发表于 2011-10-10 11:42:29

afan及众高手请进,发现 FileSRER2Line 此函数的问题



原文本内容为:
提交日期        国家        城市        识别码
2011/10/7        中国        北京        4JV6GK60

需要替换的效果为:
提交日期        国家        城市        识别码
2011/10/1        中国        上海        4JV6GK60

现在的样子:
提交日期        国家        城市        识别码/10/1        中国        上海        4JV6GK60

不知道为何故?????$HDSN = "4JV6GK60"
$infostr = "2011/10/1" & @TAB & "中国" & @TAB & "上海" & @TAB & $HDSN
_FileSRER2Line("test.txt", $HDSN, $infostr,0,0,1)

;==========================================================================================
; 说明: 按指定的关键字替换或删除文本行,可选择是否使用正则表达式,是否写新文件等。
; 语法: _FileSRER2Line('文件路径'[, '搜索字符'[, '替换'[, 匹配标志[, 正则标志[, 回车符[, 写入标志]]]]]])
; 参数: 可选参数:如'搜索字符'字符为空(默认)则删除所有空行。
;    可选参数:如'替换'字符为空(默认)则删除匹配行,且不会留下空行。
;    可选参数:匹配标志 = 1 :整行需完全匹配(默认);匹配标志 = 0 :行中只需包含关键字。
;    可选参数:使用正则标志 = 1 使用正则(默认),为 0 不使用正则,使用原始字符串匹配。
;    可选参数:回车符标志 = 1 仅识别有回车符的断行@CRLF(默认,速度快),为 0 只要有换行符@LF即识别为断行。
;    可选参数:写入标志 = '' 写入原文件(默认);不为空则写入指定文件;= 0 仅返回不写入。
; 注意: 本函数以行作为操作单位,即不管在一行中含有几处关键字均按一个替换单位操作。
; 返回值:返回替换后的字符串。替换次数保存在@extended宏中。
; 作者: Afan -- http://www.autoitx.com
;=====================================================================================start
Func _FileSRER2Line($File, $pattern = '', $replace = '', $flag = 1, $SRE = 1, $CR = 1, $Write = '')
      Local $sFile = String(FileRead($File)), $strqhz = '', $extended = 0, $sRER, $strZY, $CRF = ''
      If $CR = 0 Then $CRF = '?'
      If $pattern = '' Then
                $sRER = StringRegExpReplace(@CRLF & $sFile, '\r' & $CRF & '\n(?=\r' & $CRF & '\n)|\r' & $CRF & '\n$', '')
      Else
                If $SRE = 0 Then
                        $strZY = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
                        $pattern = StringRegExpReplace($pattern, $strZY, '\\$1')
                        $replace = StringRegExpReplace($replace, $strZY, '\\$1')
                EndIf
                If $flag = 0 Then $strqhz = '[^\r\n]*'
                Local $patternWZ = $strqhz & $pattern & $strqhz
                $pattern = '(\r' & $CRF & '\n)' & $patternWZ & '(?=\r' & $CRF & '\n)|\r' & $CRF & '\n' & $patternWZ & '$'
                If $replace <> '' Then
                        $sRER = StringRegExpReplace(@CRLF & $sFile, $pattern, '\1' & $replace)
                Else
                        $sRER = StringRegExpReplace(@CRLF & $sFile, $pattern, '')
                EndIf
      EndIf
      $extended = $extended + @extended
      $sRER = StringRegExpReplace($sRER, '^\r' & $CRF & '\n', '')
      If $Write = '' And $Write <> '0' Then
                $sTmp = FileOpen($File, 2)
                FileWrite($sTmp, $sRER)
                FileClose($sTmp)
      ElseIf $Write <> '' Then
                $sTmp = FileOpen($Write, 2)
                FileWrite($sTmp, $sRER)
                FileClose($sTmp)
      EndIf
      SetExtended($extended)
      Return $sRER
EndFunc   ;==>_FileSRER2Line

jj119120 发表于 2011-10-10 15:12:15

$HDSN = "4JV6GK60"
$infostr = @CR & "2011/10/1" & @TAB & "中国" & @TAB & "上海" & @TAB & $HDSN
_FileSRER2Line("test.txt", $HDSN, $infostr,0,0,1)

;==========================================================================================
; 说明: 按指定的关键字替换或删除文本行,可选择是否使用正则表达式,是否写新文件等。
; 语法: _FileSRER2Line('文件路径'[, '搜索字符'[, '替换'[, 匹配标志[, 正则标志[, 回车符[, 写入标志]]]]]])
; 参数: 可选参数:如'搜索字符'字符为空(默认)则删除所有空行。
;    可选参数:如'替换'字符为空(默认)则删除匹配行,且不会留下空行。
;    可选参数:匹配标志 = 1 :整行需完全匹配(默认);匹配标志 = 0 :行中只需包含关键字。
;    可选参数:使用正则标志 = 1 使用正则(默认),为 0 不使用正则,使用原始字符串匹配。
;    可选参数:回车符标志 = 1 仅识别有回车符的断行@CRLF(默认,速度快),为 0 只要有换行符@LF即识别为断行。
;    可选参数:写入标志 = '' 写入原文件(默认);不为空则写入指定文件;= 0 仅返回不写入。
; 注意: 本函数以行作为操作单位,即不管在一行中含有几处关键字均按一个替换单位操作。
; 返回值:返回替换后的字符串。替换次数保存在@extended宏中。
; 作者: Afan -- http://www.autoitx.com
;=====================================================================================start
Func _FileSRER2Line($File, $pattern = '', $replace = '', $flag = 1, $SRE = 1, $CR = 1, $Write = '')
      Local $sFile = String(FileRead($File)), $strqhz = '', $extended = 0, $sRER, $strZY, $CRF = ''
      If $CR = 0 Then $CRF = '?'
      If $pattern = '' Then
                $sRER = StringRegExpReplace(@CRLF & $sFile, '\r' & $CRF & '\n(?=\r' & $CRF & '\n)|\r' & $CRF & '\n$', '')
      Else
                If $SRE = 0 Then
                        $strZY = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
                        $pattern = StringRegExpReplace($pattern, $strZY, '\\$1')
                        $replace = StringRegExpReplace($replace, $strZY, '\\$1')
                EndIf
                If $flag = 0 Then $strqhz = '[^\r\n]*'
                Local $patternWZ = $strqhz & $pattern & $strqhz
                $pattern = '(\r' & $CRF & '\n)' & $patternWZ & '(?=\r' & $CRF & '\n)|\r' & $CRF & '\n' & $patternWZ & '$'
                If $replace <> '' Then
                        $sRER = StringRegExpReplace(@CRLF & $sFile, $pattern, '\1' & $replace)
                Else
                        $sRER = StringRegExpReplace(@CRLF & $sFile, $pattern, '')
                EndIf
      EndIf
      $extended = $extended + @extended
      $sRER = StringRegExpReplace($sRER, '^\r' & $CRF & '\n', '')
      If $Write = '' And $Write <> '0' Then
                $sTmp = FileOpen($File, 2)
                FileWrite($sTmp, $sRER)
                FileClose($sTmp)
      ElseIf $Write <> '' Then
                $sTmp = FileOpen($Write, 2)
                FileWrite($sTmp, $sRER)
                FileClose($sTmp)
      EndIf
      SetExtended($extended)
      Return $sRER
EndFunc   ;==>_FileSRER2Line加个@CR 就没问题了

afan 发表于 2011-10-10 19:23:07

回复 1# elexy

第33行的“\1”改为“${1}”就可以了~ 即:$sRER = StringRegExpReplace(@CRLF & $sFile, $pattern, '${1}' & $replace)这是我才接触正则不久写的函数,考虑不周全~ 感谢反馈~

jj119120 发表于 2011-10-10 20:45:40

原来是函数BUG……

menfan1 发表于 2011-10-11 20:02:38

继续找BUG哈,函数越来越成熟哦
页: [1]
查看完整版本: afan及众高手请进,发现 FileSRER2Line 此函数的问题