golang regexp находит совпадающие строки

#regex #go

#регулярное выражение #Вперед

Вопрос:

У меня есть строки формата %s/%s/%s:%s , где есть четыре подстроки. Первые три подстроки разделяются символом / , а последняя — символом : . Я хочу извлечь отдельные подстроки. Например:

 package main

import (
    "regexp"
    "fmt"
)

func main() {
    re := regexp.MustCompile(".*/.*/.*:.*")
    fmt.Println(re.FindAllStringSubmatch("a/b/c-c:d", -1))
}
  

В приведенной выше программе я хотел, чтобы: a , b , c-c и d были напечатаны как отдельные элементы. Но я не могу извлечь отдельные поля. Вся строка возвращается как первый элемент массива, который FindAllStringSubmatch возвращает. Каков способ извлечения отдельных элементов, которые соответствуют регулярному выражению?

Ссылка на игровую площадку:https://play.golang.org/p/M1sKGl0n2tK

Комментарии:

1.Вы имеете в виду использование 4 групп? ([^/:] )/([^/:] )/([^/:] ):([^/:] ) regex101.com/r/9trHtP/1

Ответ №1:

Используйте разделение, поскольку его шаблон исправлен, вы знаете, что он : разделен, тогда / разделенное регулярное выражение является дорогостоящим процессом процессора

 parts := strings.Split("a/b/c-c:d", ":")
fmt.Println(strings.Split(parts[0], "/"), parts[1])
  

и если вы предпочитаете использовать regex, то также используйте полное совпадение ^ в начале и $ в конце

 "^([^/] )/([^/] )/([^/] ):([^:] )$"
  

например, это не будет соответствовать "a/a/b/c-c:d" , но будет соответствовать "a/b/c-c:d"

Ответ №2:

Используйте захваченную группу для извлечения отдельных строк.
Попробуйте использовать приведенное ниже регулярное выражение для сопоставления строки и использования $1,$2,$3,$4 для сопоставления отдельных строк.

 (. )/(. )/(. ):(. )
  

ДЕМОНСТРАЦИЯ