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

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