Помогите написать регулярное выражение (golang)

надо на go найти, получить и потом заменить в тексте слова, заключенные в определенные символы (заменить вместе с этими символами). Пример строки: str := "text some text ${example_text}"

Найти надо подстроку, заключенную в ${ }. И потом эту подстроку вместе с окружающими символами заменить.

Пока мне удалось только определить, что строка содержит комбинацию

m, _ := regexp.MatchString(^\$\{.*\}$, valueField.(string)).

Дальше пока ступор, подскажите, пожалуйста, как действовать.


Ответы (2 шт):

Автор решения: ksa

Предложу такую регулярку...

let s = "text some text ${example_text}"
const r = /\${[^}]*}/
s = s.replace(r, 'новое_значение')
console.log(s)

→ Ссылка
Автор решения: Pak Uula

В пакете 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 значение ещё одной переменной
→ Ссылка