【问题标题】:Regex "before text matching" in GoLangGoLang中的正则表达式“文本匹配之前”
【发布时间】:2017-12-16 23:22:27
【问题描述】:

我尝试用 GoLang 替换一段 JavaScript 代码。逻辑要求我将以下字符串拆分为“;”仅当后跟“I”或“D”时:

I.E.viewability:-2;D.ua:Mozilla/5.0 (Linux; Android 7.0; SM-G920W8 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36;D.G.city:Burnaby;D.G.zip:V5C;D.G.region:BC;D.G.E.country_code2:CA;

在 JavaScript 中我使用:

/;(?=[ID]|$)/

我的理解是 GoLang 使用这个正则表达式库

https://github.com/google/re2/wiki/Syntax

清楚地表明上述语法(称为before text matching re)不受支持。

在 GoLang 中实现相同结果的正确方法是什么?

【问题讨论】:

  • 您可以尝试使用regexp.FindAllString。链接 => golang.org/pkg/regexp/#Regexp.FindAllString。这样,您可以找到出现正则表达式匹配的索引,并根据该索引拆分您的字符串。不会像 strings.Split() 那样简单直接:-)

标签: javascript regex go


【解决方案1】:

您可以“反转”正则表达式以匹配您需要的字符串。您想匹配除 ; 之外的任何 1+ 个字符,后跟 ;,而不是 ID

使用

[^;]+(?:;[^ID;][^;]*)*

regex demo

详情

  • [^;]+ - 1 个或多个除 ; 以外的字符
  • (?:;[^ID;][^;]*)* - 零个或多个序列:
    • ; - 一个;
    • [^ID;] - ID; 以外的字符(这是为了不匹配空值)
    • [^;]* - 除了; 之外的零个或多个字符

查看Go demo

package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`[^;]+(?:;[^ID;][^;]*)*`)
    var str = `I.E.viewability:-2;D.ua:Mozilla/5.0 (Linux; Android 7.0; SM-G920W8 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36;D.G.city:Burnaby;D.G.zip:V5C;D.G.region:BC;D.G.E.country_code2:CA;`

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

输出:

I.E.viewability:-2
D.ua:Mozilla/5.0 (Linux; Android 7.0; SM-G920W8 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36
D.G.city:Burnaby
D.G.zip:V5C
D.G.region:BC
D.G.E.country_code2:CA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多