Функция regexp.CompilePOSIX

Функция regexp.CompilePOSIX компилирует регулярное выражение в объект Regexp, используя синтаксис POSIX ERE (Extended Regular Expressions). В отличие от стандартной Compile, которая использует синтаксис RE2, эта функция обеспечивает совместимость с POSIX-стандартом. В первый параметр мы передаем строку с регулярным выражением, а возвращает функция компилированный объект Regexp и ошибку, если выражение некорректно.

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

Синтаксис

goregexp.CompilePOSIX(expr string) (*Regexp, error)

Пример

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

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  re, err := regexp.CompilePOSIX("[0-9]+")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  res := re.FindString("abc123def456")
  fmt.Println(res)
}

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

go"123"

Пример

Рассмотрим ключевое отличие POSIX-компиляции на примере с альтернативами. В POSIX-режиме выбирается самое длинное совпадение:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  rePosix, _ := regexp.CompilePOSIX("a|ab")
  reStd, _ := regexp.Compile("a|ab")

  resPosix := rePosix.FindString("ab")
  resStd := reStd.FindString("ab")

  fmt.Println("POSIX:", resPosix)
  fmt.Println("Standard:", resStd)
}

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

go"POSIX: ab"
"Standard: a"

Как видим, POSIX-версия нашла более длинное совпадение ab, в то время как стандартная остановилась на a.

Пример

При работе с некорректным регулярным выражением функция возвращает ошибку:

gopackage main

import (
  "fmt"
  "regexp"
)

func main() {
  _, err := regexp.CompilePOSIX("[")
  if err != nil {
    fmt.Println("Error:", err)
  }
}

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

go"Error: error parsing regexp: missing closing ]: `[`"

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

  • функцию regexp.Compile,
    которая компилирует выражение в стандартном режиме RE2
  • функцию regexp.MustCompilePOSIX,
    которая компилирует выражение с паникой при ошибке
  • функцию regexp.MatchString,
    которая проверяет соответствие строки регулярному выражению
  • функцию Regexp.FindString,
    которая находит первое совпадение в строке