Метод Regexp.Copy

Метод Copy создает копию объекта Regexp. Этот метод полезен, когда необходимо использовать одно и то же регулярное выражение в нескольких горутинах, так как объект Regexp не является потокобезопасным для одновременной записи. Метод возвращает новый объект Regexp, который является полной копией оригинала. Копия наследует все настройки и состояние исходного регулярного выражения.

Синтаксис

gore.Copy()

Пример

Давайте создадим регулярное выражение для поиска цифр, а затем создадим его копию и проверим, что она работает одинаково:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`\d+`)
  reCopy := re.Copy()

  res := reCopy.MatchString("123")
  fmt.Println(res)
}

Результат выполнения кода:

go"true"

Пример

Покажем, что копия действительно является независимым объектом. Если мы изменим состояние оригинала (например, с помощью метода Longest), это не повлияет на копию:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`a|ab`)
  reCopy := re.Copy()

  // Изменяем оригинал
  re.Longest()

  // Проверяем оригинал
  res1 := re.FindString("ab")
  fmt.Println(res1)

  // Проверяем копию
  res2 := reCopy.FindString("ab")
  fmt.Println(res2)
}

Результат выполнения кода:

go"ab"
"a"

В этом примере оригинал после применения метода Longest находит самое длинное совпадение ("ab"), а копия сохраняет стандартное поведение и находит первое совпадение ("a").

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
  "sync"
)

func main() {
  re := regexp.MustCompile(`[a-z]+`)
  var wg sync.WaitGroup

  for i := 0; i < 3; i++ {
    wg.Add(1)
    go func() {
      defer wg.Done()
      reCopy := re.Copy()
      res := reCopy.MatchString("abc")
      fmt.Println(res)
    }()
  }

  wg.Wait()
}

Результат выполнения кода:

go"true"
"true"
"true"

В этом примере каждая горутина создает свою копию регулярного выражения, что позволяет безопасно выполнять операции параллельно.

Смотрите также

  • метод Regexp.FindString,
    который находит первое совпадение в строке
  • метод Regexp.MatchString,
    который проверяет, соответствует ли строка регулярному выражению
  • метод Regexp.ReplaceAllString,
    который заменяет все совпадения на указанную строку
  • метод Regexp.Longest,
    который изменяет поведение поиска на поиск самого длинного совпадения