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