求教正则表达式问题[已解决]
本帖最后由 lhylm 于 2012-9-26 10:13 编辑文本文件中内容以小黑框(不知道怎么搞的换行成了小黑框了),用正则表达式匹配的时候,不能全部匹配出来。
意图:
文本文件中的内容为文件路径,我想要用正则表达匹配:文件名中含有关键字的,就把这一行显示出来:
如:f:\图片\图片\新建 文本文档.txt
f:\图片\图片素材.zip
f:\图片\图像素材\常用图标\top_bg.gif
f:\图片\图像素材\常用图标\top_bg.jpg
关键字:图片那么匹配出来:f:\图片\图片素材.zip 路径中的含有关键字的不做匹配结果。
关键字:zip 匹配出来:f:\图片\图片素材.zip
关键字:.gif 匹配出来:f:\图片\图像素材\常用图标\top_bg.gif
关键字:top_bg.jpg 匹配出来:f:\图片\图像素材\常用图标\top_bg.jpg
附件中的文本文件数据,使用正则表达式:(?m)(?i).*图片素材[^\\]*\v?$无法匹配出来相关内容;
(?m)(?i).*top3[^\\]*\v?$ 也无法匹配出来。
请大侠帮我解决一下,谢谢!
非常感谢各位大侠的帮助,问题解决了,符合我需求的答案在13#。 黑框应该是\n前面没有\r的情况,词事本里显示就是黑框 $openMftFile = FileOpen("file.txt", 0)
$keyword="jpg"
$mftRead = StringLower(FileRead($openMftFile))
$aRecords = StringRegExp($mftRead,".*"&$keyword,3)
For $x = 1 To UBound($aRecords)-1
;MsgBox(0,"",$aRecords[$x])
ConsoleWrite($aRecords[$x]&@CRLF)
Next不知道是不是这个意思 加在\r\n换行后,还是无法匹配。好像是正则表达式问题。 回复 3# kevinch
谢谢!kevinch,你的代码我试过了,还是没法匹配完全。可能我没有表述清楚。在文件名中含有关键字的就把这行提取出来! 本帖最后由 duck904 于 2012-9-25 17:59 编辑
分解路径,获得文件名,然后去正则匹配(其实用StringInStr())就可以了,下面的没有处理大小写#include <Array.au3>
test("JPG", "file.txt")
Func test($sKeyWords, $sFile)
Local $line, $iFile,$sRs, $sRegExp
$iFile = FileOpen($sFile)
$sRegExp = ".*" & $sKeyWords & ".*"
$sRs = ""
While 1
Local $line = FileReadLine($iFile)
If @error = -1 Then ExitLoop
Local $aPathList = StringSplit($line,"\\")
Local $sFileName = $aPathList[$aPathList]
If StringRegExp ( $sFileName, $sRegExp) Then $sRs = $sRs & $line & @LF
WEnd
FileClose($iFile)
$aTmp = StringSplit($sRs, @LF)
_ArrayDisplay($aTmp)
EndFunc $openMftFile = FileOpen("file.txt", 0)
$keyword="top"
$mftRead = StringLower(FileRead($openMftFile))
$aRecords = StringRegExp($mftRead,".*"&$keyword&"[^\\]*(?=[\r\n]|$)",3)
For $x = 1 To UBound($aRecords)-1
;MsgBox(0,"",$aRecords[$x])
ConsoleWrite($aRecords[$x]&@CRLF)
Next那是这个意思? 回复 7# kevinch
文本文件中含有的 关键字:“图片素材” 还是无法匹配出来,路径中含有关键字的提取,文件名中含有关键字的提取出来。
如:
$openMftFile = FileOpen("file.txt", 0)
$keyword="图片素材"
$mftRead = StringLower(FileRead($openMftFile))
$aRecords = StringRegExp($mftRead,".*"&$keyword&"[^\\]*(?=[\r\n]|$)",3)
For $x = 1 To UBound($aRecords)-1
MsgBox(0,"",$aRecords[$x])
; ConsoleWrite($aRecords[$x]&@CRLF)
Next
无法提取含有“图片素材”关键字的行。 回复 8# lhylm
关键字为:
$keyword=".txt"
$keyword="txt"
$keyword="文档"
$keyword="图片素材.zip" ;关键字为文件全名或含大写字母的也无法匹配出来 回复 6# duck904
谢谢!分解路径的话,会影响到效率! 本帖最后由 duck904 于 2012-9-25 18:25 编辑
kevinch 的基础上改了下,其中还有个问题,就是关键字中不能有正则的特殊字符(如.^*等),解决办法就是把关键字中的特殊字符前加‘\’ 预处理下,自己搞定吧#include <Array.au3>
test("图片素材", "file.txt")
Func test($sKeyWords, $sFile)
Local $line, $iFile,$sRs, $sRegExp
$iFile = FileOpen($sFile)
$sRegExp = ".*" & StringLower($sKeyWords) & "[^\\]*"
While 1
Local $line = FileReadLine($iFile)
If @error = -1 Then ExitLoop
If StringRegExp(StringLower($line), $sRegExp) Then $sRs = $sRs & $line & @LF
WEnd
FileClose($iFile)
$aTmp = StringSplit($sRs, @LF)
_ArrayDisplay($aTmp)
EndFunc 回复 10# lhylm
你确定??不要想当然哦~~ 回复 10# lhylm
其实1楼的关键代码已经很接近成功了#include<array.au3>
$openMftFile = FileOpen("file.txt", 0)
$mftRead = FileRead($openMftFile)
$keyword = 'jpg'
$aRecords = StringRegExp($mftRead,"(?m)(?i).*?[^\\]*" & $keyword & "[^\\]*$",3)
_ArrayDisplay($aRecords) 回复 8# lhylm $openMftFile = FileOpen("file.txt", 0)
$keyword="素材"
$mftRead = StringLower(FileRead($openMftFile))
$aRecords = StringRegExp($mftRead,".*"&$keyword&".*",3)
For $x = 1 To UBound($aRecords)-1
;MsgBox(0,"",$aRecords[$x])
ConsoleWrite($aRecords[$x]&@CRLF)
Next描述了半天,原来就是一行里有关键字就行 回复 13# user3000
非常感谢!问题解决!
页:
[1]
2