douxunwei8259 2017-07-12 13: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 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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)