douxunwei8259
2017-07-12 13:35
浏览 103
已采纳

正则表达式“ golang文本匹配之前”

I have a piece of Javascript code that I'm trying to replace with golang. The logic requires me to split the following string on ";" only when followed by "I" or "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;

In javascript I accomplish this using:

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

My understanding is that golang uses this regex lib

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

which clearly shows the above syntax (called before text matching re) as not supported.

What would be the correct way of achieving the same result in golang ?

Thanks in advance !

图片转代码服务由CSDN问答提供 功能建议

我有一段Java语言代码,我正尝试用golang替换。 逻辑要求我在“;”上分割以下字符串 仅当后跟“ I”或“ D”时:

  IEviewability:-2; D.ua:Mozilla / 5.0(Linux; Android 7.0; SM-G920W8 Build /  NRD90M)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 59.0.3071.125移动Safari / 537.36; DGcity:Burnaby; DGzip:V5C; DGregion:BC; DGEcountry_code2:CA; 
   
 
 

在javascript中,我使用以下命令完成此操作:

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

我的理解是golang使用此正则表达式库

https://github.com/google/re2/wiki/语法

可以清楚地显示上述语法(在文本匹配之前称为

在golang中获得相同结果的正确方法是什么?

预先感谢!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • douruhu4282 2017-07-12 13:39
    已采纳

    You may "reverse" the regex to match the strings you need. You want to match any 1+ chars other than ; followed with ; that are not followed with I or D.

    Use

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

    See the regex demo

    Details:

    • [^;]+ - 1 or more chars other than ;
    • (?:;[^ID;][^;]*)* - zero or more sequences of:
      • ; - a ;
      • [^ID;] - a char other than I, D or ; (that is in order not to match empty values)
      • [^;]* - zero or more chars other than ;

    See a 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)
        }
    }
    

    Output:

    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
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题