我有一个文件" D:\ test.log"它有两种风格之一。如果用户在收到消息时离线,则会显示此消息:
[02:19:47]兄弟Aimbot(adama900):(已于2016年3月31日星期五05:15:09保存)这是一个测试线
如果用户在收到消息时在线,则会出现这种情况:
[02:19:47] Aimbot弟兄(adama900):这是一个测试线
我想要做的就是剪掉多余的部分,如果它是第一种或第二种样式,它就会像这样:
兄弟Aimbot(adama900)这是一个测试线
然后将其放入消息框中。
这是我的代码:
Sub main()
filename = "D:\Test.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(filename)
LNEVAL = f.ReadLine
LNENUM = 0
Do Until f.AtEndOfStream
For i = 1 To LNENUMs
f.ReadLine
Next
If InStr(LNEVAL, "(S") Then
LNEVAL = Left(LNEVAL, (Len("(S")+4))
MsgBox = LNEVAL
End If
Loop
f.Close
End Sub
这是我到目前为止所做的。
答案 0 :(得分:0)
使用regular expression替代品做你想做的事情相当简单。基本上你想要做的就是从每一行中删除三件事:
正则表达式^\[.*?\]
匹配字符串开头的空心方括号和最接近方括号的最短字符数。
正则表达式\(Saved.*?\)
匹配左括号后跟单词Saved
和最短字符数直到右括号。但是,由于此部分是可选的,因此您需要通过将表达式置于非捕获组并向其附加?
修饰符((?:...)?
)来指示表达式可以出现零次或一次。
将您想要保留的子匹配放在括号中以创建捕获组
^\[.*?\] (.*?): (?:\(Saved.*?\))?(.*)
和replace每个匹配的行只包含捕获的组:
Set re = New RegExp
re.Pattern = ...
Set f = fso.OpenTextFile(filename)
Do Until f.AtEndOfStream
MsgBox re.Replace(f.ReadLine, "$1 $2")
Loop
f.Close
对您现有代码的一些评论:
For i = 1 To LNENUMs
:此循环始终被跳过,因为您将LNEUMs
设置为0.由于您只在f.ReadLine
内For
循环外Do
}循环变成一个无限循环,因为你永远不会把文件读到最后。Len("(S")+4
始终求值为6,因为字符串(S
的长度不会改变,因此您只需用数值替换表达式。MsgBox = LNEVAL
:MsgBox
功能无法正常工作。删除函数名称和消息之间的=
。