找回密码
 加入
搜索
查看: 11045|回复: 19

[AU3基础] 求教正则表达式问题[已解决]

 火.. [复制链接]
发表于 2012-9-25 16:50:22 | 显示全部楼层 |阅读模式
本帖最后由 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#。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-9-25 17:30:24 | 显示全部楼层
黑框应该是\n前面没有\r的情况,词事本里显示就是黑框
发表于 2012-9-25 17:39:43 | 显示全部楼层
$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
不知道是不是这个意思
 楼主| 发表于 2012-9-25 17:40:19 | 显示全部楼层
加在\r\n换行后,还是无法匹配。好像是正则表达式问题。
 楼主| 发表于 2012-9-25 17:51:06 | 显示全部楼层
回复 3# kevinch

谢谢!kevinch,你的代码我试过了,还是没法匹配完全。可能我没有表述清楚。在文件名中含有关键字的就把这行提取出来!
发表于 2012-9-25 17:56:59 | 显示全部楼层
本帖最后由 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[0]]
                
                If StringRegExp ( $sFileName, $sRegExp) Then $sRs = $sRs & $line & @LF

        WEnd
        FileClose($iFile)
        $aTmp = StringSplit($sRs, @LF)
        _ArrayDisplay($aTmp)
EndFunc

评分

参与人数 1金钱 +20 收起 理由
annybaby + 20 同意!!

查看全部评分

发表于 2012-9-25 18:00:44 | 显示全部楼层
$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
那是这个意思?
 楼主| 发表于 2012-9-25 18:06:32 | 显示全部楼层
回复 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
无法提取含有“图片素材”关键字的行。
 楼主| 发表于 2012-9-25 18:12:17 | 显示全部楼层
回复 8# lhylm


    关键字为:
$keyword=".txt"
$keyword="txt"
$keyword="文档"
$keyword="图片素材.zip" ;关键字为文件全名或含大写字母的也无法匹配出来
 楼主| 发表于 2012-9-25 18:18:04 | 显示全部楼层
回复 6# duck904


    谢谢!分解路径的话,会影响到效率!
发表于 2012-9-25 18:24:19 | 显示全部楼层
本帖最后由 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
发表于 2012-9-25 18:29:27 | 显示全部楼层
回复 10# lhylm

你确定??不要想当然哦~~
发表于 2012-9-25 19:58:51 | 显示全部楼层
回复 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)
发表于 2012-9-25 20:36:27 | 显示全部楼层
回复 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
描述了半天,原来就是一行里有关键字就行
 楼主| 发表于 2012-9-26 10:10:32 | 显示全部楼层
回复 13# user3000

非常感谢!问题解决!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-23 16:31 , Processed in 0.087358 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表