2017-01-31 25 views
5
ab1-cde23-fg45-h6-ijk-789.lmn.local.  86400 IN A 12.34.5.123 

W następującym wpisie DNS próbuję dopasować sekcję h6 (pozycja 4). W tym momencie wiem, że ta część domeny składa się tylko z 2 liter/cyfr lub jednego z każdym, więc można ją dopasować (w niezdarny sposób) zregex - Jak dopasować podciąg po X wystąpieniach wzorca?

"-[a-zA-Z0-9]{2}-" 

W przypadku, gdy mogłem nie zakładaj, że jest to jedyna sekcja domeny z 2 literami/cyframi, jak mogę dopasować tylko zawartość czwartej pozycji minus -? (ab1 jest pierwsza pozycja, cde23 drugi, i tak dalej, ze wszystkimi pozycjami oddzielonych -)

jestem w stanie dopasować się do 4. pozycji z poniższej regex, ale obejmuje wszystko od początek.

Używam wyrażeń regularnych w języku golang.

+1

Czy wymagane regex? Dlaczego nie podzielić, a następnie wybrać 4. element z tablicy? –

+0

Mogłem rzeczywiście zrobić to poprzez podział struny, ale byłem ciekawy, jak można to osiągnąć dzięki regexowi :-) – Cocotton

Odpowiedz

6

Do:

^(?:[^-]+-){3}([^-]+) 
  • ^(?:[^-]+-){3} mecze - oddzielone 3 pierwsze pola, (?:) sprawia, że ​​grupa nie-robienia

  • Zdobyty grupy, ([^-]+) będzie zawierał oddzieloną 4th pole -.

Demo


Chociaż jesteśmy na tym, należy być może patrzeć na ciąg manipulacji zamiast kosztownego wdrożenia Regex, zwykły strings.Split() należy zrobić:

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]) 
} 
+0

To zadziałało! Miałem pewne problemy z grupami, które pomogły mi lepiej zrozumieć! – Cocotton

+0

@Cocotton Great. Sprawdź także moje edycje; Myślę, że manipulowanie strunami powinno być w tym przypadku. – heemayl

+0

Tak, to by się dobrze sprawdziło! Ale przyznaję, że myślałem, że regex będzie szybszy niż proste manipulacje ciągami. Bardzo interesujące, dzięki! – Cocotton