lhylm 发表于 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#。

kevinch 发表于 2012-9-25 17:30:24

黑框应该是\n前面没有\r的情况,词事本里显示就是黑框

kevinch 发表于 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不知道是不是这个意思

lhylm 发表于 2012-9-25 17:40:19

加在\r\n换行后,还是无法匹配。好像是正则表达式问题。

lhylm 发表于 2012-9-25 17:51:06

回复 3# kevinch

谢谢!kevinch,你的代码我试过了,还是没法匹配完全。可能我没有表述清楚。在文件名中含有关键字的就把这行提取出来!

duck904 发表于 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]
               
                If StringRegExp ( $sFileName, $sRegExp) Then $sRs = $sRs & $line & @LF

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

kevinch 发表于 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那是这个意思?

lhylm 发表于 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
无法提取含有“图片素材”关键字的行。

lhylm 发表于 2012-9-25 18:12:17

回复 8# lhylm


    关键字为:
$keyword=".txt"
$keyword="txt"
$keyword="文档"
$keyword="图片素材.zip" ;关键字为文件全名或含大写字母的也无法匹配出来

lhylm 发表于 2012-9-25 18:18:04

回复 6# duck904


    谢谢!分解路径的话,会影响到效率!

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

annybaby 发表于 2012-9-25 18:29:27

回复 10# lhylm

你确定??不要想当然哦~~

user3000 发表于 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)

kevinch 发表于 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描述了半天,原来就是一行里有关键字就行

lhylm 发表于 2012-9-26 10:10:32

回复 13# user3000

非常感谢!问题解决!
页: [1] 2
查看完整版本: 求教正则表达式问题[已解决]