douxunwei8259 2017-07-12 05:35
浏览 135
已采纳

正则表达式“ 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 !

  • 写回答

1条回答 默认 最新

  • douruhu4282 2017-07-12 05: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
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部