Home > Net >  How to match in a single/common Regex Group matching or based on a condition
How to match in a single/common Regex Group matching or based on a condition

Time:06-29

I would like to extract two different test strings /i/int/2021/11/18/019e1691-614c-4402-a8c1-d0239ad1ac45/,640-1_999899,480-1_999899,960-1_999899,1280-1_999899,1920-1_999899,.mp4.csmil/master.m3u8?set-segment-duration=responsive and

/i/int/2021/11/25/,live_20211125_215206_sendeton_640x360-50p-1200kbit,live_20211125_215206_sendeton_480x270-50p-700kbit,live_20211125_215206_sendeton_960x540-50p-1600kbit,live_20211125_215206_sendeton_1280x720-50p-3200kbit,live_20211125_215206_sendeton_1920x1080-50p-5000kbit,.mp4.csmil/master.m3u8

with a single RegEx and in Group-1.

By using this RegEx ^.[i,na,fm,d] \/(. ([,\/])?(\/|. =. ,\/). \/[,](live.([^,]).). _)?. (640).*$ I can get the second string to match the desired result int/2021/11/25/,live_20211125_215206_

but the first string does not match in Group-1 and the missing expected test string 1 extraction is int/2021/11/18/019e1691-614c-4402-a8c1-d0239ad1ac45

Any pointers on this is appreciated.

Thanks!

CodePudding user response:

We can't know all the rules of how the strings your are matching are constructed, but for just these two example strings provided:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    var re = regexp.MustCompile(`(?m)(\/i/int/\d{4}/\d{2}/\d{2}/.*)(?:\/,|_[\w_] )640`)
    var str = `
/i/int/2021/11/18/019e1691-614c-4402-a8c1-d0239ad1ac45/,640-1_999899,480-1_999899,960-1_999899,1280-1_999899,1920-1_999899,.mp4.csmil/master.m3u8?set-segment-duration=responsive
/i/int/2021/11/25/,live_20211125_215206_sendeton_640x360-50p-1200kbit,live_20211125_215206_sendeton_480x270-50p-700kbit,live_20211125_215206_sendeton_960x540-50p-1600kbit,live_20211125_215206_sendeton_1280x720-50p-3200kbit,live_20211125_215206_sendeton_1920x1080-50p-5000kbit,.mp4.csmil/master.m3u8`

    match := re.FindAllStringSubmatch(str, -1)

    for _, val := range match {
        fmt.Println(val[1])
    }
}

CodePudding user response:

If you want both values in group 1, you can use:

^/(?:[id]|na|fm)/([^/\s]*/\d{4}/\d{2}/\d{2}/\S*?)(?:/,|[^_] _)640(?:\D|$)

The pattern matches:

  • ^ Start of string
  • / Match literally
  • (?:[id]|na|fm) Match one of i d na fm
  • / Match literally
  • ( Capture group 1
    • [^/\s]*/ Match any char except a / or a whitespace char, then match /
    • \d{4}/\d{2}/\d{2}/ Match a date like pattern
    • \S*? Match optional non whitespace chars, as few as possible
  • ) Close group 1
  • (?:/,|[^_] _) Match either /, or 1 chars other than _ and then match _
  • 640 Match literally
  • (?:\D|$) Match either a non digits or assert end of string

See a regex demo and a go demo.

  • Related