regex - 如何在X次出现模式后匹配子字符串?

Coc*_*ton 5 regex go

ab1-cde23-fg45-h6-ijk-789.lmn.local.        86400 IN A  12.34.5.123
Run Code Online (Sandbox Code Playgroud)

在以下DNS条目中,我正在尝试匹配该h6部分(位置4).在这一点上,我知道域的这一部分只由2个字母/数字或每个字母组成,所以我可以匹配它(以笨拙的方式)

"-[a-zA-Z0-9]{2}-"
Run Code Online (Sandbox Code Playgroud)

在我不能假设这是2个字母/数字的域的唯一部分的情况下,我怎么能只匹配第4个位置的内容减去-?(ab1作为第一个位置,cde23第二个,依此类推,所有位置分开-)

我可以使用以下正则表达式匹配第4个位置,但它从一开始就包含所有内容.

"([a-zA-Z0-9]*-){3}[a-zA-Z0-9]*-"
Run Code Online (Sandbox Code Playgroud)

我在golang中使用这些regexp.

hee*_*ayl 6

做:

^(?:[^-]+-){3}([^-]+)
Run Code Online (Sandbox Code Playgroud)
  • ^(?:[^-]+-){3}匹配-分开的前3个字段,(?:)使组不捕获

  • 捕获的组([^-]+) 将包含-分隔的第4个字段.

演示


虽然我们在这,你应该看看字符串操作而不是昂贵的Regex实现,普通strings.Split()应该这样做:

package main

import (
    "fmt"
    "strings"
)

func main() {
    s := "ab1-cde23-fg45-h6-ijk-789.lmn.local.        86400 IN A  12.34.5.123"
    fmt.Println(strings.Split(s, "-")[3])
}
Run Code Online (Sandbox Code Playgroud)