Vbscript 清除日志文件中的行

Vbscript 清除日志文件中的行,vbscript,Vbscript,我有一个文件“D:\test.log”,它有两种样式之一。当用户收到以下消息时,如果用户处于脱机状态,则会出现此消息: [02:19:47]艾伯特兄弟(adama900):(保存于2016年3月31日星期四05:15:09)这是一条测试线 如果用户在收到消息时处于联机状态,则情况如下: 艾伯特兄弟(阿达玛900):这是一条测试线 我想做的是去掉多余的部分,如果是第一种或第二种样式,它会是这样的: Aimbot兄弟(adama900)这是一条测试线 然后将其放入消息框中 这是我的密码: Sub m

我有一个文件“D:\test.log”,它有两种样式之一。当用户收到以下消息时,如果用户处于脱机状态,则会出现此消息:

[02:19:47]艾伯特兄弟(adama900):(保存于2016年3月31日星期四05:15:09)这是一条测试线

如果用户在收到消息时处于联机状态,则情况如下:

艾伯特兄弟(阿达玛900):这是一条测试线

我想做的是去掉多余的部分,如果是第一种或第二种样式,它会是这样的:

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

这就是我到目前为止所拥有的。

用替换件做你想做的事情相当简单。基本上,您要做的是从每行中删除三件事:

  • 字符串开头方括号之间的子字符串
  • 将名称与消息分隔的冒号,以及
  • 该冒号后面的括号之间的可选子字符串
正则表达式
^\[.*?\]
匹配字符串开头的方括号和最短的字符数(直到结束方括号)

正则表达式
\(Saved.*?\)
匹配一个左括号,后跟单词
Saved
,以及最短的字符数(直到右括号)。但是,由于此部分是可选的,您需要通过将表达式放入非捕获组并向其添加
修饰符(
(?:…)?
)来指示表达式可以零次或一次出现

将要保留的子匹配放在括号中,以创建捕获组

^\[.*?\](.*?:(?:\(已保存.*?\)(.*)
每个匹配行只包含捕获的组:

Set re=New RegExp
模式=。。。
Set f=fso.OpenTextFile(文件名)
直到f.AtEndOfStream
MsgBox更换(f.ReadLine,“$1$2”)
环
f、 接近

对现有代码的一些评论:

  • 对于i=1到LNENUMs
    :始终跳过此循环,因为您将
    LNEUMs
    设置为0。由于您只在
    f.ReadLine
    中执行
    For
    循环,因此外部
    do
    循环将成为一个无限循环,因为您从未将文件读到底
  • Len(“(S”)+4
    的计算结果始终为6,因为字符串
    (S
    的长度不会改变,所以可以用数值替换表达式
  • MsgBox=LNEVAL
    :函数不能以这种方式工作。请删除函数名和消息之间的
    =

替换件很容易做到你想做的事情。基本上,你想做的是从每一行中删除三件事:

  • 字符串开头方括号之间的子字符串
  • 将名称与消息分隔的冒号,以及
  • 该冒号后面的括号之间的可选子字符串
正则表达式
^\[.*?\]
匹配字符串开头的方括号和最短的字符数(直到结束方括号)

正则表达式
\(已保存。*?\)
匹配一个左括号,后跟单词
Saved
,以及最短的字符数(最多为右括号)。但是,由于此部分是可选的,您需要将表达式放入非捕获组并在其上附加
修饰符(
(?:…)?

将要保留的子匹配放在括号中,以创建捕获组

^\[.*?\](.*?:(?:\(已保存.*?\)(.*)
每个匹配行只包含捕获的组:

Set re=New RegExp
模式=。。。
Set f=fso.OpenTextFile(文件名)
直到f.AtEndOfStream
MsgBox更换(f.ReadLine,“$1$2”)
环
f、 接近

对现有代码的一些评论:

  • For i=1 To LNENUMs
    :此循环始终被跳过,因为您将
    LNEUMs
    设置为0。由于您只在该
    For
    循环内部执行
    f.ReadLine
    ,因此您的外部
    do
    循环将成为一个无限循环,因为您从未将文件读到底
  • Len(“(S”)+4
    的计算结果始终为6,因为字符串
    (S
    的长度不会改变,所以可以用数值替换表达式
  • MsgBox=LNEVAL
    :函数不能以这种方式工作。请删除函数名和消息之间的
    =