首页 > 解决方案 > 正则表达式匹配不同的分隔符

问题描述

我需要在两个定界符之间获取字符串。而这对定界符是不同的。这是我的文字:

[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 和请求类型(之后 -> 在 \{d} 之前)

这是我的正则表达式:

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

我得到什么:

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

我无法>从最后一场比赛中删除。或者也许整个正则表达式是错误的?

标签: regexgo

解决方案


您可以使用

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

查看正则表达式演示

在 Go 中,声明为

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

细节

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

演示

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

推荐阅读