Помогите написать регулярное выражение (golang)
надо на go найти, получить и потом заменить в тексте слова, заключенные в определенные символы (заменить вместе с этими символами). Пример строки: str := "text some text ${example_text}"
Найти надо подстроку, заключенную в ${ }. И потом эту подстроку вместе с окружающими символами заменить.
Пока мне удалось только определить, что строка содержит комбинацию
m, _ := regexp.MatchString(^\$\{.*\}$, valueField.(string)).
Дальше пока ступор, подскажите, пожалуйста, как действовать.
Ответы (2 шт):
Предложу такую регулярку...
let s = "text some text ${example_text}"
const r = /\${[^}]*}/
s = s.replace(r, 'новое_значение')
console.log(s)
В пакете regexp есть метод Regexp.ReplaceAllStringFunc
Этот метод заменяет все вхождения строк, удовлетворяющих регулярному выражению, на результат работы функции подстановки. Функция получает на вход подстроку и по ней вычисляет замену.
Предлагаю регулярное выражение
// Регулярное выражение для поиска строк вида
// 'начинается с ${, затем любые символы кроме { и }
// в любом количестве, заканчивается }'
re := regexp.MustCompile(`\${[^{}]*}`)
В качестве функции замены предлагаю написать функцию, которая извлекает из найденной подстроки имя переменной и ищет соответствующее значение в таблице переменных
// Таблица значений переменных
varTable := map[string]string{
"some_var": "значение переменной some_var",
"another_var": "значение ещё одной переменной",
}
// Функция замены, подставляет значение переменной из таблицы varTable
substitutor := func(match string) string {
// match - значение вида `${var_name}`
// сначала извлечём var_name
varName := match[2 : len(match)-1]
// Теперь получим значение из таблицы
value, ok := varTable[varName]
if !ok {
// один из вариантов обработки отсутствующего значения - вернуть пустую строку
value = ""
}
return value
}
Обработка строки:
// Заменяем все подстроки, соответствующие регулярному выражению
result := re.ReplaceAllStringFunc(str, substitutor)
Всё вместе:
package main
import (
"fmt"
"regexp"
)
func main() {
// Регулярное выражение для поиска строк вида 'начинается с ${, затем любые символы кроме { и } в любом количестве, заканчивается }'
re := regexp.MustCompile(`\${[^{}]*}`)
// Функция замены, подставляет значение переменной из таблицы varTable
// Таблица значений переменных
varTable := map[string]string{
"some_var": "значение переменной some_var",
"another_var": "значение ещё одной переменной",
}
substitutor := func(match string) string {
// match - значение вида `${var_name}`
// сначала извлечём var_name
varName := match[2 : len(match)-1]
// Теперь получим значение из таблицы
value, ok := varTable[varName]
if !ok {
// один из вариантов обработки отсутствующего значения - вернуть пустую строку
value = ""
}
return value
}
// Строка, в которой ищем выражения вида `${some_var}`
str := "text some text ${some_var} and ${another_var}"
// Заменяем все подстроки, соответствующие регулярному выражению
result := re.ReplaceAllStringFunc(str, substitutor)
fmt.Println("Таблица переменных : ", varTable)
fmt.Println("Строка : ", str)
fmt.Println("Результат подстановки: ", result)
}
Результат:
Таблица переменных : map[another_var:значение ещё одной переменной some_var:значение переменной some_var]
Строка : text some text ${some_var} and ${another_var}
Результат подстановки: text some text значение переменной some_var and значение ещё одной переменной