正则表达式以匹配不同的除草机

时间:2018-07-27 13:00:43

标签: regex go

我需要在两个除臭器之间获取字符串。而且这对除草机是不同的。这是我的文字:

[2018.07.10 00:30:03:640][TraceID: 8HRWSI105YVO91]->StartExecuteTask\35
[2018.07.10 00:30:18:585][TraceID: 8707HFH7NR6307]->RequestInfo\27
[2018.07.10 00:30:18:585][TraceID: 8707HFH7NR6307]->RequestExecuteEnd\16
[2018.07.10 00:30:18:585][TraceID: 8707HFH7NR6307]->OutgoingData\26651
[2018.07.10 00:31:16:773][TraceID: G8EM5LANBPC32H]->CheckUserInfo\141

我需要获取时间,Traceid和requset类型(在->之后,在\ {d}之前)

这是我的正则表达式:

[\[|\->](.*?)[\\|\]]

我得到的是

2018.07.10 00:30:03:640   TraceID: 8HRWSI105YVO91  >StartExecuteTask
2018.07.10 00:30:18:585   TraceID: 8707HFH7NR6307  >RequestInfo

我无法从上一场比赛中删除>。还是整个正则表达式是错误的?

1 个答案:

答案 0 :(得分:3)

您可以使用

(?:\[|->)(.*?)[\\\]]

请参见regex demo

在Go中,声明为

var re = regexp.MustCompile(`(?:\[|->)(.*?)[\\\]]`)

详细信息

  • (?:\[|->)-与[字符或->子字符串匹配的non-capturing group
  • (.*?)-第1组:除换行符以外的任何0+个字符,且尽可能少
  • [\\\]]-一个\]字符。

Demo

package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`(?:\[|->)(.*?)[\\\]]`)
    var str = `[2018.07.10 00:30:03:640][TraceID: 8HRWSI105YVO91]->StartExecuteTask\35`

    for _, match := range re.FindAllStringSubmatch(str, -1) {
        fmt.Println(match[1])
    }   
}

输出:

2018.07.10 00:30:03:640
TraceID: 8HRWSI105YVO91
StartExecuteTask