请教个正则提取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 $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:58 编辑
回复 2# smartzbs
联系到楼主的另一贴,他的意思源字符串应该是不带括号的,因此貌似没有办法。只能从获取此段字符串的源头处理。
在楼主的另一贴我提出过此问题,不过楼主未理睬。http://www.autoitx.com/forum.php?mod=viewthread&tid=11567&page=1&fromuid=7644923#pid119690 9楼 回复 3# afan
问过好几位高手,都没能解决
不知道是不是就无法用正则了,还是有其他方法! 本帖最后由 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 回复 5# smartzbs
猜到肯定是@TAB这种情况…… 追问了LZ几次源头,就是不说,没办法~ 回复 4# zz999
你都不说源头…… 本帖最后由 zz999 于 2009-12-31 15:47 编辑
回复 7# afan
我给出TXT在附件里的
因为下载要钱
没人下.我就直接复制出来的!
回复 8# zz999
我是指如何获取的…… 回复 9# afan
http://www.rayfile.com/files/62262463-f5e1-11de-8724-0014221b798a/
我把东西打包发在网盘里了
麻烦您看一下!看有什么好办法
前三项我是用的 StringMid 获取的
后面不会了
考虑分区标签可能多种多样! 本帖最后由 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 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 不用正则的方法,
给我这样的菜鸟:
$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]