Найти текст, которого нет внутри другой текстовой строки? - PullRequest
0 голосов
/ 17 марта 2020

Скажем, у меня есть некоторый текст шаблона с заполнителями, как показано ниже:

Message: {{ .response.message }}  
More results: {{ .response.has_more_results }}. 
Results: 
{{range .response.results}}
   Contact name: {{.admin_contact.name.value}}
{{end}}

Я хотел бы создать регулярное выражение, которое будет извлекать заполнители, которые не внутри {{range ...}} .... {{end}} раздел. Так что в приведенном выше примере я хотел бы получить .response.message и .response.has_more_results.

Я придумал следующее регулярное выражение: {{\s?(\.\S*?)\s?}}, но это также включает .admin_contact.name.value, который я хотел бы исключить .

Как я могу использовать регулярные выражения для вытягивания только тех заполнителей, которые находятся за пределами range разделов?

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете использовать шаблон регулярного выражения, который будет соответствовать тому, что вам не нужно, и захватить в группу 1 те подстроки, которые вам нужно извлечь:

(?s){{range.*?}}.*?{{end}}|{{\s*(\.[^\s{}]+)\s*}}

См. Регулярное выражение демо

Подробности

  • (?s){{range.*?}}.*?{{end}} - (?s) позволяет . сопоставлять символы разрыва строки, {{range соответствует {{range, .*? соответствует любым 0+ символам как можно меньше, а затем {{end}} соответствует буквенной строке
  • | - или
  • {{ - {{ substring
  • \s* - 0+ пробелов
  • (\.[^\s{}]+) - группа 1: a . и затем любые 1+ символов, кроме пробелов, { и }
  • \s* - 0+ пробелов
  • }} - подстрока }}.

Go демо :

package main

import (
    "fmt"
    "regexp"
)

func main() {

    re := regexp.MustCompile(`(?s){{range.*?}}.*?{{end}}|{{\s*(\.[^\s{}]+)\s*}}`)
    str := "Message: {{ .response.message }}  \nMore results: {{ .response.has_more_results }}. \nResults: \n{{range .response.results}}\n   Contact name: {{.admin_contact.name.value}}\n{{end}}"
    for _, match := range re.FindAllStringSubmatch(str, -1) {
    fmt.Printf("%v\n", match[1])
    }
}

Выход:

.response.message
.response.has_more_results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...