Поскольку go не поддерживает негативные запросы, я не думаю, что найти регулярное выражение, соответствующее .
, на которое вы хотите разбить, будет легко / возможно. Вместо этого вы можете сопоставить окружающий текст и захватывать только соответствующим образом:
Так что само регулярное выражение немного уродливо, но вот разбивка (игнорирование экранированных символов для go):
(\'[^.'"]+(?:\.[^.'"]+)+\')|(\"[^.'"]+(?:\.[^.'"]+)+\")|(?:([^.'"]+)\.?)|(?:\.([^.'\"]+))
Существует четыре сценария, которым соответствует это регулярное выражение, и фиксируются определенные подмножества этих совпадений:
(\'[^.'"]+(?:\.[^.'"]+)+\')
- сопоставление и захват текста в одинарных кавычках
\'
- Совпадение '
буквально
[^.'"]+
- совпадение последовательности без кавычек и непериодов
(?:\.[^.'"]+)+
- Соответствует периоду, за которым следует последовательность без кавычек и непериодов, повторяемая столько раз, сколько необходимо. Не пойман.
\'
- Совпадение '
буквально
(\"[^.'"]+(?:\.[^.'"]+)+\")
- сопоставление и захват текста в двойных кавычках
- То же, что и выше, но с двойными кавычками
(?:([^.'"]+)\.?)
- сопоставить текст с необязательным .
, не захватывая .
([^.'"]+)
- Совпадение и захват последовательности без кавычек и непериодов
\.?
- При желании сопоставить точку (необязательно, чтобы захватить последний бит текста с разделителями)
(?:\.([^.'"]+))
- Соответствует тексту, которому предшествует .
, не захватывая .
- То же, что и выше, но с периодом, предшествующим группе захвата, а также необязательным
Пример кода, который выводит снимки:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("('[^.'\"]+(?:\\.[^.'\"]+)+')|(\"[^.'\"]+(?:\\.[^.'\"]+)+\")|(?:([^.'\"]+)\\.?)|(?:\\.([^.'\"]+))")
txt := "a.b.c.'d.e'"
result:= re.FindAllStringSubmatch(txt, -1)
for k, v := range result {
fmt.Printf("%d. %s\n", k, v)
}
}