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 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀