zz999 发表于 2009-12-29 23:08:02

请教个正则提取TXT文本内任意字符的问题

本帖最后由 zz999 于 2009-12-30 12:47 编辑

C:   1:1   A   (发生 发)   (10226)   (6242)
上面3个括号中的字符正则怎么提取
尤其是第一个括号里的,可能是任意字符,可能可空格!


C:   1:1   A   (发生 发)   (10226)   (6242)
本身不含有空格
原来是这样子的
C:   1:1   A   发生 发   10226    6242

smartzbs 发表于 2009-12-30 08:30:13

$s = "C:   1:1   A   (发生 发)   (10226)   (6242)"
;$r = "\(.*?\)";含()
$r = "\((.*?)\)";不含()
$array = StringRegExp($s, $r, 3)

for $i = 0 to UBound($array) - 1
    msgbox(0, "RegExp Test with Option 3 - " & $i, $array[$i])
Next

afan 发表于 2009-12-30 11:56:22

本帖最后由 afan 于 2009-12-30 11:58 编辑

回复 2# smartzbs


    联系到楼主的另一贴,他的意思源字符串应该是不带括号的,因此貌似没有办法。只能从获取此段字符串的源头处理。
在楼主的另一贴我提出过此问题,不过楼主未理睬。http://www.autoitx.com/forum.php?mod=viewthread&tid=11567&page=1&fromuid=7644923#pid119690 9楼

zz999 发表于 2009-12-30 15:41:19

回复 3# afan

问过好几位高手,都没能解决
不知道是不是就无法用正则了,还是有其他方法!

smartzbs 发表于 2009-12-30 15:43:30

本帖最后由 smartzbs 于 2009-12-30 15:50 编辑

哦,看了楼主传来的.txt文件,字符分隔是<tab>键,楼主你没表达出前三项也要,那就很简单了.
$s = "";从你自己的文本中读一行出来,在这贴文字会使<tab>键丢失
;$r = "(.*?)(?: *\t|$)";简单正则,最后一个元素略去即可,如For $i = 0 to UBound($array) - 2
$r = "(.*?)(?:(?: *\t)|(?: +$))";稍好一些正则,避免最后一个空元素
$array = StringRegExp($s, $r, 3)

For $i = 0 to UBound($array) - 1
    Msgbox(0, "", $array[$i])
Next

afan 发表于 2009-12-30 17:03:13

回复 5# smartzbs


    猜到肯定是@TAB这种情况…… 追问了LZ几次源头,就是不说,没办法~

afan 发表于 2009-12-30 17:04:42

回复 4# zz999


    你都不说源头……

zz999 发表于 2009-12-31 15:42:55

本帖最后由 zz999 于 2009-12-31 15:47 编辑

回复 7# afan

我给出TXT在附件里的
因为下载要钱
没人下.我就直接复制出来的!


afan 发表于 2009-12-31 15:45:47

回复 8# zz999


    我是指如何获取的……

zz999 发表于 2009-12-31 15:52:44

回复 9# afan


http://www.rayfile.com/files/62262463-f5e1-11de-8724-0014221b798a/

我把东西打包发在网盘里了
麻烦您看一下!看有什么好办法
前三项我是用的   StringMid   获取的
后面不会了
考虑分区标签可能多种多样!

afan 发表于 2009-12-31 16:49:00

本帖最后由 afan 于 2009-12-31 18:24 编辑

回复 10# zz999 #include <Array.au3>

$str = FileRead('1.txt')
$array = StringRegExp($str, '[\n|\t]([^\n\t]+)', 3)
If Not @Error Then _ArrayDisplay($array, '')

afan 发表于 2009-12-31 18:22:08

本帖最后由 afan 于 2009-12-31 19:10 编辑


$str = FileRead('1.txt')
$array = StringRegExp($str, '[\n|\t]([^\n\t]+)', 3)
If @error Then Exit
For $i = 1 To UBound($array) - 3 Step 6
        MsgBox(0, 0, _
                        'Drive:' & $array[$i] & @CRLF & _
                        'No.:' & $array[$i + 1] & @CRLF & _
                        'Active:' & $array[$i + 2] & @CRLF & _
                        'VolumeLabe:' & $array[$i + 3] & @CRLF & _
                        'Total (Mb):' & $array[$i + 4] & @CRLF & _
                        'Free (Mb):' & $array[$i + 5])
Next下面是完整的载入列表例子~#include <GuiListView.au3>

$Form1 = GUICreate("测试", 400, 200)
$ListView1 = GUICtrlCreateListView('Drive|No.|Active|VolumeLabe|Total (Mb)|Free (Mb)', 5, 5, 390, 150)
$BtSx = GUICtrlCreateButton('刷新/载入', 200, 165, 90, 25)
$BtExit = GUICtrlCreateButton('退出', 300, 165, 90, 25)
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3, $BtExit
                        Exit
                Case $BtSx
                        _GUICtrlListView_DeleteAllItems($ListView1)
                        ld('1.txt')
        EndSwitch
WEnd

Func ld($iFile)
        Local $array = StringRegExp(FileRead($iFile), '[\n|\t]([^\n\t]+)', 3), $i, $dt
        If @error Then Return MsgBox(48, 0, '错误')
        For $i = 1 To UBound($array) - 3 Step 6
                $dt = $array[$i] & '|' & $array[$i + 1] & '|' & $array[$i + 2] & '|' & $array[$i + 3] & '|' & $array[$i + 4] & '|' & $array[$i + 5]
                GUICtrlCreateListViewItem($dt, $ListView1)
        Next
EndFunc   ;==>ld

sanmoking 发表于 2009-12-31 19:04:11

不用正则的方法,
给我这样的菜鸟:

$txt = ""
$i =1
While 1
$line = FileReadLine ("diskinfo.txt",$i)
If @error = -1 Then ExitLoop
$i+=1
If StringMid ($line,2,1) = ":" Then      $txt = $txt & StringReplace(StringReplace(StringTrimLeft ($line, 10), " ", ""),@TAB,"|")&@CR
WEnd
MsgBox(0,0,$txt)


页: [1]
查看完整版本: 请教个正则提取TXT文本内任意字符的问题