Метод regexp.Regexp.Longest

Метод Regexp.Longest применяется к скомпилированному регулярному выражению и изменяет его поведение таким образом, что при поиске совпадений будет выбираться самое длинное из возможных совпадений. По умолчанию регулярные выражения в Go выбирают самое левое совпадение, а при наличии нескольких вариантов - самое короткое. Метод Longest меняет это поведение на выбор самого длинного совпадения среди всех возможных. Метод не принимает параметров и не возвращает значений, он изменяет состояние самого объекта Regexp.

Синтаксис

gore.Longest()

Пример

Давайте рассмотрим базовый пример использования метода Longest. Создадим регулярное выражение, которое может найти несколько совпадений в строке, и сравним поведение с методом Longest и без него:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`a+`)
  text := "aaa"

  // Обычное поведение - самое короткое совпадение
  res := re.FindString(text)
  fmt.Println(res)

  // После вызова Longest - самое длинное совпадение
  re.Longest()
  res = re.FindString(text)
  fmt.Println(res)
}

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

go"a"
"aaa"

Пример

Рассмотрим более сложный пример с альтернативами. Регулярное выражение a|ab может совпасть как с символом 'a', так и с подстрокой 'ab'. Без вызова Longest будет выбрано самое левое и короткое совпадение:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`a|ab`)
  text := "ab"

  // Без Longest - выбирается самое левое и короткое
  res := re.FindString(text)
  fmt.Println(res)

  // С Longest - выбирается самое длинное
  re.Longest()
  res = re.FindString(text)
  fmt.Println(res)
}

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

go"a"
"ab"

Пример

Метод Longest особенно полезен при работе с повторяющимися шаблонами. Рассмотрим пример с квантификаторами:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re := regexp.MustCompile(`\d+`)
  text := "12345"

  // По умолчанию FindString находит самое короткое
  res := re.FindString(text)
  fmt.Println(res)

  // Longest заставляет найти самое длинное
  re.Longest()
  res = re.FindString(text)
  fmt.Println(res)
}

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

go"1"
"12345"

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

  • метод Regexp.Find,
    который находит первое совпадение с регулярным выражением
  • метод Regexp.FindAll,
    который находит все совпадения с регулярным выражением
  • метод Regexp.Match,
    который проверяет, соответствует ли строка регулярному выражению
  • метод Regexp.ReplaceAll,
    который заменяет все совпадения на другую строку