cpp

Регулярные выражения. Замена фрагментов

Выполнить замену найденных фрагментов позволяют следующие методы:

  • ReplaceAllString() — возвращает строку, которая является результатом поиска и замены в исходной строке с использованием регулярного выражения. Формат метода:
(*regexp.Regexp).ReplaceAllString(src string, repl string) string

Заменим все числа в строке символом +:

re := regexp.MustCompile(`[0-9]+`)
s := "10 20 30"
fmt.Println(re.ReplaceAllString(s, "+")) // + + +

В строке repl можно использовать специальные переменные $1, ..., $N, через которые доступны фрагменты, заключенные внутри шаблона в круглые скобки. Можно также воспользоваться следующим форматом: ${1}, ..., ${N}. Чтобы вставить символ $ его необходимо удвоить.

В качестве примера поменяем два тега местами:

re := regexp.MustCompile(`<([a-z]+)><([a-z]+)>`)
s := "<br><hr>"
fmt.Println(re.ReplaceAllString(s, "<$2><$1>"))     // <hr><br>
fmt.Println(re.ReplaceAllString(s, "<${2}><${1}>")) // <hr><br>

После символа $ вместо индекса группы можно указать название группы. Возможно также указание названия группы внутри фигурных скобок:

re := regexp.MustCompile(`<(?P<a>[a-z]+)><(?P<b>[a-z]+)>`)
s := "<br><hr>"
fmt.Println(re.ReplaceAllString(s, "<$b><$a>"))     // <hr><br>
fmt.Println(re.ReplaceAllString(s, "<${b}><${a}>")) // <hr><br>
  • ReplaceAllLiteralString() — возвращает строку, которая является результатом поиска и замены в исходной строке с использованием регулярного выражения. Формат метода:
(*regexp.Regexp).ReplaceAllLiteralString(src string,
                                         repl string) string

В отличие от метода ReplaceAllString() в строке repl нельзя использовать специальные переменные $1, ..., $N. Пример:

re := regexp.MustCompile(`[0-9]+`)
s := "10 20 30"
fmt.Println(re.ReplaceAllLiteralString(s, "+")) // + + +
  • ReplaceAllStringFunc() — возвращает строку, которая является результатом поиска и замены в исходной строке с использованием регулярного выражения. Найденные фрагменты заменяются значением, возвращаемым функцией repl. Формат метода:
(*regexp.Regexp).ReplaceAllStringFunc(src string,
                 repl func(string) string) string

В качестве примера найдем все числа в строке и прибавим к ним число 10:

re := regexp.MustCompile(`[0-9]+`)
s := "10 20 30"
fmt.Println(re.ReplaceAllStringFunc(s, func(s string) string {
   var x int = 0
   _, err := fmt.Sscanln(s, &x)
   if err != nil {
      return "0"
   }
   x += 10
   return fmt.Sprintf("%d", x)
})) // 20 30 40
  • ReplaceAll() — возвращает байтовый слайс, который является результатом поиска и замены в исходном байтовом слайсе с использованием регулярного выражения. Формат метода:
(*regexp.Regexp).ReplaceAll(src []byte, repl []byte) []byte

Заменим все числа символом +:

re := regexp.MustCompile(`[0-9]+`)
s := []byte("10 20 30")
fmt.Printf("%q\n", re.ReplaceAll(s, []byte("+"))) // "+ + +"

В слайсе repl можно использовать специальные переменные $1, ..., $N, через которые доступны фрагменты, заключенные внутри шаблона в круглые скобки. Можно также воспользоваться следующим форматом: ${1}, ..., ${N}. Чтобы вставить символ $ его необходимо удвоить.

В качестве примера поменяем два тега местами:

re := regexp.MustCompile(`<([a-z]+)><([a-z]+)>`)
s := []byte("<br><hr>")
fmt.Printf("%q\n", re.ReplaceAll(s, []byte("<$2><$1>")))
// "<hr><br>"
fmt.Printf("%q\n", re.ReplaceAll(s, []byte("<${2}><${1}>")))
// "<hr><br>"

После символа $ вместо индекса группы можно указать название группы. Возможно также указание названия группы внутри фигурных скобок:

re := regexp.MustCompile(`<(?P<a>[a-z]+)><(?P<b>[a-z]+)>`)
s := []byte("<br><hr>")
fmt.Printf("%q\n", re.ReplaceAll(s, []byte("<$b><$a>")))
// "<hr><br>"
fmt.Printf("%q\n", re.ReplaceAll(s, []byte("<${b}><${a}>")))
// "<hr><br>"
  • ReplaceAllLiteral() — возвращает байтовый слайс, который является результатом поиска и замены в исходном байтовом слайсе с использованием регулярного выражения. Формат метода:
(*regexp.Regexp).ReplaceAllLiteral(src []byte,
                                   repl []byte) []byte

В отличие от метода ReplaceAll() в слайсе repl нельзя использовать специальные переменные $1, ..., $N. Пример:

re := regexp.MustCompile(`[0-9]+`)
s := []byte("10 20 30")
fmt.Printf("%q\n", re.ReplaceAllLiteral(s, []byte("+")))
// "+ + +"
  • ReplaceAllFunc() — возвращает байтовый слайс, который является результатом поиска и замены в исходном байтовом слайсе с использованием регулярного выражения. Найденные фрагменты заменяются значением, возвращаемым функцией repl. Формат метода:
(*regexp.Regexp).ReplaceAllFunc(src []byte,
                 repl func([]byte) []byte) []byte

Пример:

re := regexp.MustCompile(`[0-9]+`)
s := []byte("10 20 30")
fmt.Printf("%q\n", re.ReplaceAllFunc(s, func(b []byte) []byte {
   return []byte("+")
})) // "+ + +"
  • ExpandString() — возвращает байтовый слайс, который является результатом поиска и замены в строке с использованием регулярного выражения. Формат метода:
(*regexp.Regexp).ExpandString(dst []byte, template string,
                              src string, match []int) []byte

В параметре dst указывается слайс, к значению которого будет добавлен результат. Параметр template задает строку для замены найденного фрагмента в строке src. В параметре match указывается слайс с индексами найденных фрагментов (возвращается методом FindAllStringSubmatchIndex()). Метод возвращает байтовый слайс с результатом всех замен.

В строке template можно использовать специальные переменные $1, ..., $N, через которые доступны фрагменты, заключенные внутри шаблона в круглые скобки. Можно также воспользоваться следующим форматом: ${1}, ..., ${N}. Чтобы вставить символ $ его необходимо удвоить.

В качестве примера поменяем два тега местами:

re := regexp.MustCompile(`<([a-z]+)><([a-z]+)>`)
result := []byte{}
s := "<br><hr>"
for _, submatches := range re.FindAllStringSubmatchIndex(s, -1) {
   result = re.ExpandString(result, "<${2}><${1}>",
                            s, submatches)
}
fmt.Printf("%q\n", result) // "<hr><br>"

После символа $ вместо индекса группы можно указать название группы. Возможно также указание названия группы внутри фигурных скобок:

re := regexp.MustCompile(`<(?P<a>[a-z]+)><(?P<b>[a-z]+)>`)
result := []byte{}
s := "<br><hr>"
for _, submatches := range re.FindAllStringSubmatchIndex(s, -1) {
   result = re.ExpandString(result, "<${b}><${a}>",
                            s, submatches)
}
fmt.Printf("%q\n", result) // "<hr><br>"
  • Expand() — возвращает байтовый слайс, который является результатом поиска и замены внутри байтового слайса с использованием регулярного выражения. Формат метода:
(*regexp.Regexp).Expand(dst []byte, template []byte,
                        src []byte, match []int) []byte

В параметре dst указывается байтовый слайс, к значению которого будет добавлен результат. Параметр template задает байтовый слайс со значением для замены найденного фрагмента в байтовом слайсе src. В параметре match указывается слайс с индексами найденных фрагментов (возвращается методом FindAllSubmatchIndex()). Метод возвращает байтовый слайс с результатом всех замен.

В слайсе template можно использовать специальные переменные $1, ..., $N, через которые доступны фрагменты, заключенные внутри шаблона в круглые скобки. Можно также воспользоваться следующим форматом: ${1}, ..., ${N}. Чтобы вставить символ $ его необходимо удвоить.

В качестве примера поменяем два тега местами:

re := regexp.MustCompile(`<([a-z]+)><([a-z]+)>`)
result := []byte{}
s := []byte("<br><hr>")
for _, submatches := range re.FindAllSubmatchIndex(s, -1) {
   result = re.Expand(result, []byte("<${2}><${1}>"),
                      s, submatches)
}
fmt.Printf("%q\n", result) // "<hr><br>"

После символа $ вместо индекса группы можно указать название группы. Возможно также указание названия группы внутри фигурных скобок:

re := regexp.MustCompile(`<(?P<a>[a-z]+)><(?P<b>[a-z]+)>`)
result := []byte{}
s := []byte("<br><hr>")
for _, submatches := range re.FindAllSubmatchIndex(s, -1) {
   result = re.Expand(result, []byte("<${b}><${a}>"),
                      s, submatches)
}
fmt.Printf("%q\n", result) // "<hr><br>"

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp