Пакет regexp
Обзор
Пакет regexp реализует поиск по регулярным выражениям.
Синтаксис принимаемых регулярных выражений соответствует общему синтаксису, используемому в Perl, Python и других языках. Точнее, это синтаксис, принимаемый RE2 и описанный по адресу https://golang.org/s/re2syntax, за исключением \C. Обзор синтаксиса см. в пакете regexp/syntax.
Реализация регулярных выражений, предоставляемая этим пакетом, гарантирует выполнение за время, линейно зависящее от размера входных данных. (Это свойство не гарантируется большинством реализаций регулярных выражений с открытым исходным кодом.) Подробнее об этом свойстве см. по адресу https://swtch.com/~rsc/regexp/regexp1.html или в любой книге по теории автоматов.
Все символы — это кодовые точки в кодировке UTF-8. Согласно utf8.DecodeRune, каждый байт некорректной последовательности UTF-8 рассматривается так, как если бы он кодировал utf8.RuneError (U+FFFD).
У Regexp есть 24 метода, которые сопоставляют регулярное выражение и определяют соответствующий ему текст. Их имена соответствуют следующему регулярному выражению:
(All|Find|FindAll)(String)?(Submatch)?(Index)?
Варианты ‘All’ возвращают итератор по последовательным неперекрывающимся совпадениям всего выражения. Вместо этого варианты ‘FindAll’ возвращают срез этих совпадений. Пустые совпадения, примыкающие к предыдущему совпадению, игнорируются. Варианты ‘FindAll’ принимают дополнительный целочисленный аргумент n. Если n >= 0, функция возвращает не более n совпадений/подсовпадений; в противном случае она возвращает их все.
Варианты ‘Find’ возвращают только первое совпадение, которое вернул бы вариант All или FindAll.
Если присутствует ‘String’, аргумент имеет тип string; в противном случае он имеет тип []byte.
По умолчанию каждое возвращаемое совпадение представлено подстрокой, соответствующей регулярному выражению; её тип — string или []byte в зависимости от типа аргумента. Если присутствует ‘Submatch’, каждое совпадение вместо этого представлено срезом подстрок, соответствующих подвыражениям регулярного выражения, заключённым в круглые скобки (также называемым захватывающими группами), пронумерованным слева направо в порядке открывающих скобок. Submatch 0 — это совпадение всего выражения, submatch 1 — совпадение первого подвыражения в круглых скобках и так далее. Если присутствует ‘Index’, каждая подстрока вместо этого представлена парой индексов байтов во входной строке. Отрицательный индекс или nil-подстрока означает, что подвыражению не соответствует ни одна строка во входных данных. Для вариантов ‘String’ пустая строка означает либо отсутствие совпадения, либо пустое совпадение.
Некоторые методы можно применять также к тексту, считываемому из io.RuneReader: Regexp.MatchReader, Regexp.FindReaderIndex, Regexp.FindReaderSubmatchIndex. Обратите внимание, что для сопоставления регулярного выражения может потребоваться изучить текст за пределами текста, возвращённого совпадением, поэтому методы, сопоставляющие текст из io.RuneReader, могут прочитать произвольное количество входных данных перед возвратом результата.
(Есть ещё несколько методов, не соответствующих этому шаблону.)
Пример
Код:
// Compile the expression once, usually at init time.
// Use raw strings to avoid having to quote the backslashes.
var validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`)
fmt.Println(validID.MatchString("adam[23]"))
fmt.Println(validID.MatchString("eve[7]"))
fmt.Println(validID.MatchString("Job[48]"))
fmt.Println(validID.MatchString("snakey"))
Вывод:
true true false false
Указатель
Примеры
- Пакет
- Match
- MatchString
- QuoteMeta
- Regexp.Expand
- Regexp.ExpandString
- Regexp.Find
- Regexp.FindAll
- Regexp.FindAllIndex
- Regexp.FindAllString
- Regexp.FindAllStringSubmatch
- Regexp.FindAllStringSubmatchIndex
- Regexp.FindAllSubmatch
- Regexp.FindAllSubmatchIndex
- Regexp.FindIndex
- Regexp.FindString
- Regexp.FindStringIndex
- Regexp.FindStringSubmatch
- Regexp.FindSubmatch
- Regexp.FindSubmatchIndex
- Regexp.Longest
- Regexp.Match
- Regexp.MatchString
- Regexp.NumSubexp
- Regexp.ReplaceAll
- Regexp.ReplaceAllLiteralString
- Regexp.ReplaceAllString
- Regexp.ReplaceAllStringFunc
- Regexp.Split
- Regexp.SubexpIndex
- Regexp.SubexpNames
Файлы пакета
backtrack.go exec.go onepass.go regexp.go
func Match
func Match(pattern string, b []byte) (matched bool, err error)
Match сообщает, содержит ли срез байтов b совпадение с шаблоном регулярного выражения. Для более сложных запросов необходимо использовать Compile и полный интерфейс Regexp.
Пример
Код:
matched, err := regexp.Match(`foo.*`, []byte(`seafood`)) fmt.Println(matched, err) matched, err = regexp.Match(`bar.*`, []byte(`seafood`)) fmt.Println(matched, err) matched, err = regexp.Match(`a(b`, []byte(`seafood`)) fmt.Println(matched, err)
Вывод:
true <nil> false <nil> false error parsing regexp: missing closing ): `a(b`
func MatchReader
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)
MatchReader сообщает, содержит ли текст, возвращаемый io.RuneReader, совпадение с шаблоном регулярного выражения. Для более сложных запросов необходимо использовать Compile и полный интерфейс Regexp.
func MatchString
func MatchString(pattern string, s string) (matched bool, err error)
MatchString сообщает, содержит ли строка s совпадение с шаблоном регулярного выражения. Для более сложных запросов необходимо использовать Compile и полный интерфейс Regexp.
Пример
Код:
matched, err := regexp.MatchString(`foo.*`, "seafood") fmt.Println(matched, err) matched, err = regexp.MatchString(`bar.*`, "seafood") fmt.Println(matched, err) matched, err = regexp.MatchString(`a(b`, "seafood") fmt.Println(matched, err)
Вывод:
true <nil> false <nil> false error parsing regexp: missing closing ): `a(b`
func QuoteMeta
func QuoteMeta(s string) string
QuoteMeta возвращает строку, в которой экранированы все метасимволы регулярных выражений из текста аргумента; возвращённая строка представляет собой регулярное выражение, совпадающее с исходным текстом буквально.
Пример
Код:
fmt.Println(regexp.QuoteMeta(`Escaping symbols like: .+*?()|[]{}^$`))
Вывод:
Escaping symbols like: \.\+\*\?\(\)\|\[\]\{\}\^\$
type Regexp
Regexp — это представление скомпилированного регулярного выражения. Regexp можно безопасно использовать одновременно из нескольких горутин, за исключением методов настройки, таких как Regexp.Longest.
type Regexp struct {
// contains filtered or unexported fields
}
func Compile
func Compile(expr string) (*Regexp, error)
Compile разбирает регулярное выражение и в случае успеха возвращает объект Regexp, который можно использовать для поиска совпадений в тексте.
При поиске в тексте regexp возвращает совпадение, которое начинается как можно раньше во входных данных (самое левое), а среди таких совпадений выбирает то, которое первым нашёл бы поиск с возвратом. Эта так называемая семантика поиска самого левого совпадения соответствует семантике Perl, Python и других реализаций, хотя этот пакет реализует её без затрат на поиск с возвратом. О поиске самого длинного из самых левых совпадений в стиле POSIX см. CompilePOSIX.
func CompilePOSIX
func CompilePOSIX(expr string) (*Regexp, error)
CompilePOSIX подобен Compile, но ограничивает синтаксис регулярных выражений стандартом POSIX ERE (egrep) и меняет семантику поиска на поиск самого длинного из самых левых совпадений.
То есть при поиске в тексте regexp возвращает совпадение, которое начинается как можно раньше во входных данных (самое левое), а среди таких совпадений выбирает самое длинное. Эта так называемая семантика поиска самого длинного из самых левых совпадений соответствует семантике ранних реализаций регулярных выражений и спецификации POSIX.
Однако самых длинных из самых левых совпадений может быть несколько, и варианты выбора подсовпадений у них могут различаться; в этом случае данный пакет отходит от POSIX. Среди возможных совпадений пакет выбирает то, которое первым нашёл бы поиск с возвратом, тогда как POSIX требует выбирать совпадение, максимизирующее длину первого подвыражения, затем второго и так далее слева направо. Правило POSIX вычислительно слишком затратное и даже не является чётко определённым. Подробности см. на странице https://swtch.com/~rsc/regexp/regexp2.html#posix.
func MustCompile
func MustCompile(str string) *Regexp
MustCompile подобен Compile, но вызывает панику, если выражение невозможно разобрать. Это упрощает безопасную инициализацию глобальных переменных, содержащих скомпилированные регулярные выражения.
func MustCompilePOSIX
func MustCompilePOSIX(str string) *Regexp
MustCompilePOSIX подобен CompilePOSIX, но вызывает панику, если выражение невозможно разобрать. Это упрощает безопасную инициализацию глобальных переменных, содержащих скомпилированные регулярные выражения.
func (*Regexp) AppendText 1.24
func (re *Regexp) AppendText(b []byte) ([]byte, error)
AppendText реализует интерфейс encoding.TextAppender. Результат совпадает с результатом вызова метода Regexp.String.
Обратите внимание, что в некоторых случаях результат содержит потери: этот метод не указывает, является ли регулярное выражение выражением POSIX (то есть было ли оно скомпилировано вызовом CompilePOSIX) и вызывался ли для него метод Regexp.Longest.
func (*Regexp) Copy 1.6
func (re *Regexp) Copy() *Regexp
Copy возвращает новый объект Regexp, скопированный из re. Вызов Regexp.Longest для одной копии не влияет на другую.
Устарело: в предыдущих версиях при использовании Regexp в нескольких горутинах создание отдельной копии для каждой горутины помогало избежать конкуренции за блокировки. Начиная с Go 1.12 использование Copy больше не требуется для предотвращения конкуренции за блокировки. Copy всё ещё может быть уместен, если он нужен для создания двух копий с разными настройками Regexp.Longest.
func (*Regexp) Expand
func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte
Expand добавляет шаблон к dst и возвращает результат; при добавлении Expand заменяет переменные в шаблоне соответствующими совпадениями, полученными из src. Срез совпадений должен быть возвращён методом Regexp.FindSubmatchIndex.
В шаблоне переменная обозначается подстрокой вида $name или ${name}, где name — непустая последовательность букв, цифр и символов подчёркивания. Чисто числовое имя, например $1, обозначает подсовпадение с соответствующим индексом; остальные имена обозначают захватывающие скобки, именованные с помощью синтаксиса (?P<name>...). Ссылка на индекс, выходящий за допустимый диапазон или не соответствующий совпадению, либо на имя, отсутствующее в регулярном выражении, заменяется пустым срезом.
В форме $name имя считается максимально длинным: $1x эквивалентно ${1x}, а не ${1}x; $10 эквивалентно ${10}, а не ${1}0.
Чтобы вставить в результат буквальный символ $, используйте в шаблоне $$.
Пример
Код:
content := []byte(`
# comment line
option1: value1
option2: value2
# another comment line
option3: value3
`)
// Regex pattern captures "key: value" pair from the content.
pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`)
// Template to convert "key: value" to "key=value" by
// referencing the values captured by the regex pattern.
template := []byte("$key=$value\n")
result := []byte{}
// For each match of the regex in the content.
for _, submatches := range pattern.FindAllSubmatchIndex(content, -1) {
// Apply the captured submatches to the template and append the output
// to the result.
result = pattern.Expand(result, template, content, submatches)
}
fmt.Println(string(result))
Вывод:
option1=value1 option2=value2 option3=value3
func (*Regexp) ExpandString
func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte
ExpandString подобен Regexp.Expand, но шаблон и источник представлены строками. Метод добавляет данные в срез байтов и возвращает его, чтобы вызывающий код мог управлять выделением памяти.
Пример
Код:
content := `
# comment line
option1: value1
option2: value2
# another comment line
option3: value3
`
// Regex pattern captures "key: value" pair from the content.
pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`)
// Template to convert "key: value" to "key=value" by
// referencing the values captured by the regex pattern.
template := "$key=$value\n"
result := []byte{}
// For each match of the regex in the content.
for _, submatches := range pattern.FindAllStringSubmatchIndex(content, -1) {
// Apply the captured submatches to the template and append the output
// to the result.
result = pattern.ExpandString(result, template, content, submatches)
}
fmt.Println(string(result))
Вывод:
option1=value1 option2=value2 option3=value3
func (*Regexp) Find
func (re *Regexp) Find(b []byte) []byte
Find возвращает текст самого левого совпадения re в b. Если совпадений нет, возвращается nil.
Пример
Код:
re := regexp.MustCompile(`foo.?`)
fmt.Printf("%q\n", re.Find([]byte(`seafood fool`)))
Вывод:
"food"
func (*Regexp) FindAll
func (re *Regexp) FindAll(b []byte, n int) [][]byte
FindAll возвращает все совпадения re в b. Если n >= 0, FindAll возвращает не более n совпадений. Эквивалентную форму итератора см. в [Regexp.All].
Пример
Код:
re := regexp.MustCompile(`foo.?`)
fmt.Printf("%q\n", re.FindAll([]byte(`seafood fool`), -1))
Вывод:
["food" "fool"]
func (*Regexp) FindAllIndex
func (re *Regexp) FindAllIndex(b []byte, n int) [][]int
FindAllIndex возвращает позиции всех совпадений re в b. Если n >= 0, FindAllIndex возвращает не более n совпадений. См. [Regexp.AllIndex] для эквивалентной формы с итератором.
Пример
Код:
content := []byte("London")
re := regexp.MustCompile(`o.`)
fmt.Println(re.FindAllIndex(content, 1))
fmt.Println(re.FindAllIndex(content, -1))
Вывод:
[[1 3]] [[1 3] [4 6]]
func (*Regexp) FindAllString
func (re *Regexp) FindAllString(s string, n int) []string
FindAllString возвращает все совпадения re в s. Если n >= 0, FindAllString возвращает не более n совпадений. См. [Regexp.AllString] для эквивалентной формы с итератором.
Пример
Код:
re := regexp.MustCompile(`a.`)
fmt.Println(re.FindAllString("paranormal", -1))
fmt.Println(re.FindAllString("paranormal", 2))
fmt.Println(re.FindAllString("graal", -1))
fmt.Println(re.FindAllString("none", -1))
Вывод:
[ar an al] [ar an] [aa] []
func (*Regexp) FindAllStringIndex
func (re *Regexp) FindAllStringIndex(s string, n int) [][]int
FindAllStringIndex возвращает позиции всех совпадений re в s. Если n >= 0, FindAllStringIndex возвращает не более n совпадений. См. [Regexp.AllStringIndex] для эквивалентной формы с итератором.
func (*Regexp) FindAllStringSubmatch
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string
FindAllStringSubmatch возвращает позиции всех совпадений re в s, включая позиции подсовпадений. В каждом возвращённом совпадении m значение m[0] — это полное совпадение, m[1] — первое подсовпадение и так далее. Если n >= 0, FindAllStringSubmatch возвращает не более n совпадений. См. [Regexp.AllStringSubmatch] для эквивалентной формы с итератором.
Пример
Код:
re := regexp.MustCompile(`a(x*)b`)
fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-", -1))
fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-", -1))
fmt.Printf("%q\n", re.FindAllStringSubmatch("-ab-axb-", -1))
fmt.Printf("%q\n", re.FindAllStringSubmatch("-axxb-ab-", -1))
Вывод:
[["ab" ""]] [["axxb" "xx"]] [["ab" ""] ["axb" "x"]] [["axxb" "xx"] ["ab" ""]]
func (*Regexp) FindAllStringSubmatchIndex
func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int
FindAllStringSubmatchIndex возвращает позиции всех совпадений re в s, включая позиции подсовпадений. В каждом возвращённом совпадении m полное совпадение — это s[m[0]:m[1]], первое подсовпадение — s[m[2]:m[3]] и так далее. Если n >= 0, FindAllStringSubmatchIndex возвращает не более n совпадений. См. [Regexp.AllStringSubmatchIndex] для эквивалентной формы с итератором.
Пример
Код:
re := regexp.MustCompile(`a(x*)b`)
// Indices:
// 01234567 012345678
// -ab-axb- -axxb-ab-
fmt.Println(re.FindAllStringSubmatchIndex("-ab-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-axxb-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-ab-axb-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-axxb-ab-", -1))
fmt.Println(re.FindAllStringSubmatchIndex("-foo-", -1))
Вывод:
[[1 3 2 2]] [[1 5 2 4]] [[1 3 2 2] [4 7 5 6]] [[1 5 2 4] [6 8 7 7]] []
func (*Regexp) FindAllSubmatch
func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte
FindAllSubmatch возвращает позиции всех совпадений re в b, включая позиции подсовпадений. В каждом возвращённом совпадении m полное совпадение — это m[0], первое подсовпадение — m[1] и так далее. Если n >= 0, FindAllSubmatch возвращает не более n совпадений. См. [Regexp.AllSubmatch] для эквивалентной формы с итератором.
Пример
Код:
re := regexp.MustCompile(`foo(.?)`)
fmt.Printf("%q\n", re.FindAllSubmatch([]byte(`seafood fool`), -1))
Вывод:
[["food" "d"] ["fool" "l"]]
func (*Regexp) FindAllSubmatchIndex
func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int
FindAllSubmatchIndex возвращает позиции всех совпадений re в b, включая позиции подсовпадений. В каждом возвращённом совпадении m полное совпадение — это b[m[0]:m[1]], первое подсовпадение — b[m[2]:m[3]] и так далее. Если n >= 0, FindAllSubmatchIndex возвращает не более n совпадений. См. [Regexp.AllSubmatchIndex] для эквивалентной формы с итератором.
Пример
Код:
content := []byte(`
# comment line
option1: value1
option2: value2
`)
// Regex pattern captures "key: value" pair from the content.
pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`)
allIndexes := pattern.FindAllSubmatchIndex(content, -1)
for _, loc := range allIndexes {
fmt.Println(loc)
fmt.Println(string(content[loc[0]:loc[1]]))
fmt.Println(string(content[loc[2]:loc[3]]))
fmt.Println(string(content[loc[4]:loc[5]]))
}
Вывод:
[18 33 18 25 27 33] option1: value1 option1 value1 [35 50 35 42 44 50] option2: value2 option2 value2
func (*Regexp) FindIndex
func (re *Regexp) FindIndex(b []byte) (m []int)
FindIndex возвращает позицию самого левого совпадения re в b. Само совпадение находится в b[m[0]:m[1]]. Если совпадений нет, возвращаемое значение равно nil.
Пример
Код:
content := []byte(`
# comment line
option1: value1
option2: value2
`)
// Regex pattern captures "key: value" pair from the content.
pattern := regexp.MustCompile(`(?m)(?P<key>\w+):\s+(?P<value>\w+)$`)
loc := pattern.FindIndex(content)
fmt.Println(loc)
fmt.Println(string(content[loc[0]:loc[1]]))
Вывод:
[18 33] option1: value1
func (*Regexp) FindReaderIndex
func (re *Regexp) FindReaderIndex(r io.RuneReader) (m []int)
FindReaderIndex возвращает позицию самого левого совпадения re в r. Совпадение начинается с байтового индекса m[0] и заканчивается непосредственно перед байтовым индексом m[1]. Если совпадений нет, возвращаемое значение равно nil.
FindReaderIndex может читать произвольно далеко из r, в том числе за пределами возвращённого совпадения.
func (*Regexp) FindReaderSubmatchIndex
func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int
FindReaderSubmatchIndex возвращает первое совпадение re в r, включая подсовпадения. Полное совпадение занимает байтовые индексы от m[0] до m[1], первое подсовпадение — от m[2] до m[3] и так далее. Если совпадений нет, возвращаемое значение равно nil.
FindReaderSubmatchIndex может читать произвольно далеко из r, в том числе за пределами возвращённого совпадения.
func (*Regexp) FindString
func (re *Regexp) FindString(s string) string
FindString возвращает текст самого левого совпадения re в s. Возвращаемым значением будет пустая строка как при пустом совпадении, так и при отсутствии совпадений. Чтобы различить эти случаи, используйте Regexp.FindStringIndex или Regexp.FindStringSubmatch.
Пример
Код:
re := regexp.MustCompile(`foo.?`)
fmt.Printf("%q\n", re.FindString("seafood fool"))
fmt.Printf("%q\n", re.FindString("meat"))
Вывод:
"food" ""
func (*Regexp) FindStringIndex
func (re *Regexp) FindStringIndex(s string) (m []int)
FindStringIndex возвращает позицию самого левого совпадения re в s. Само совпадение находится в s[m[0]:m[1]]. Если совпадений нет, возвращаемое значение равно nil.
Пример
Код:
re := regexp.MustCompile(`ab?`)
fmt.Println(re.FindStringIndex("tablett"))
fmt.Println(re.FindStringIndex("foo") == nil)
Вывод:
[1 3] true
func (*Regexp) FindStringSubmatch
func (re *Regexp) FindStringSubmatch(s string) []string
FindStringSubmatch возвращает первое совпадение re в s, включая подсовпадения. Полное совпадение — это s[0], первое подсовпадение — s[1] и так далее. Если совпадений нет, возвращаемое значение равно nil.
Пример
Код:
re := regexp.MustCompile(`a(x*)b(y|z)c`)
fmt.Printf("%q\n", re.FindStringSubmatch("-axxxbyc-"))
fmt.Printf("%q\n", re.FindStringSubmatch("-abzc-"))
Вывод:
["axxxbyc" "xxx" "y"] ["abzc" "" "z"]
func (*Regexp) FindStringSubmatchIndex
func (re *Regexp) FindStringSubmatchIndex(s string) []int
FindStringSubmatchIndex возвращает первое совпадение re в s, включая подсовпадения. Полное совпадение — это s[m[0]:m[1]], первое подсовпадение — s[m[2]:m[3]] и так далее. Если совпадений нет, возвращаемое значение равно nil.
func (*Regexp) FindSubmatch
func (re *Regexp) FindSubmatch(b []byte) [][]byte
FindSubmatch возвращает первое совпадение re в b, включая подсовпадения. Полное совпадение — это m[0], первое подсовпадение — m[1] и так далее. Если совпадений нет, возвращаемое значение равно nil.
Пример
Код:
re := regexp.MustCompile(`foo(.?)`)
fmt.Printf("%q\n", re.FindSubmatch([]byte(`seafood fool`)))
Вывод:
["food" "d"]
func (*Regexp) FindSubmatchIndex
func (re *Regexp) FindSubmatchIndex(b []byte) []int
FindSubmatchIndex возвращает первое совпадение re в b, включая подсовпадения. Полное совпадение — это b[m[0]:m[1]], первое подсовпадение — b[m[2]:m[3]] и так далее. Если совпадений нет, возвращаемое значение равно nil.
Пример
Код:
re := regexp.MustCompile(`a(x*)b`)
// Indices:
// 01234567 012345678
// -ab-axb- -axxb-ab-
fmt.Println(re.FindSubmatchIndex([]byte("-ab-")))
fmt.Println(re.FindSubmatchIndex([]byte("-axxb-")))
fmt.Println(re.FindSubmatchIndex([]byte("-ab-axb-")))
fmt.Println(re.FindSubmatchIndex([]byte("-axxb-ab-")))
fmt.Println(re.FindSubmatchIndex([]byte("-foo-")))
Вывод:
[1 3 2 2] [1 5 2 4] [1 3 2 2] [1 5 2 4] []
func (*Regexp) LiteralPrefix
func (re *Regexp) LiteralPrefix() (prefix string, complete bool)
LiteralPrefix возвращает строковый литерал, с которого должно начинаться любое совпадение регулярного выражения re. Он возвращает логическое значение true, если строковый литерал составляет всё регулярное выражение.
func (*Regexp) Longest 1.1
func (re *Regexp) Longest()
Longest заставляет последующие поиски предпочитать самое левое из самых длинных совпадений. То есть при сопоставлении с текстом регулярное выражение возвращает совпадение, которое начинается как можно раньше во входных данных (самое левое), а среди таких совпадений выбирает максимально длинное. Этот метод изменяет Regexp и не может вызываться одновременно с другими методами.
Пример
Код:
re := regexp.MustCompile(`a(|b)`)
fmt.Println(re.FindString("ab"))
re.Longest()
fmt.Println(re.FindString("ab"))
Результат:
a ab
func (*Regexp) MarshalText 1.21
func (re *Regexp) MarshalText() ([]byte, error)
MarshalText реализует encoding.TextMarshaler. Результат совпадает с результатом вызова метода Regexp.AppendText.
Дополнительные сведения см. в разделе Regexp.AppendText.
func (*Regexp) Match
func (re *Regexp) Match(b []byte) bool
Match сообщает, содержит ли срез байтов b какое-либо совпадение регулярного выражения re.
Пример
Код:
re := regexp.MustCompile(`foo.?`) fmt.Println(re.Match([]byte(`seafood fool`))) fmt.Println(re.Match([]byte(`something else`)))
Результат:
true false
func (*Regexp) MatchReader
func (re *Regexp) MatchReader(r io.RuneReader) bool
MatchReader сообщает, содержит ли текст, возвращаемый io.RuneReader, какое-либо совпадение регулярного выражения re.
func (*Regexp) MatchString
func (re *Regexp) MatchString(s string) bool
MatchString сообщает, содержит ли строка s какое-либо совпадение регулярного выражения re.
Пример
Код:
re := regexp.MustCompile(`(gopher){2}`)
fmt.Println(re.MatchString("gopher"))
fmt.Println(re.MatchString("gophergopher"))
fmt.Println(re.MatchString("gophergophergopher"))
Результат:
false true true
func (*Regexp) NumSubexp
func (re *Regexp) NumSubexp() int
NumSubexp возвращает количество подвыражений в скобках в этом Regexp.
Пример
Код:
re0 := regexp.MustCompile(`a.`)
fmt.Printf("%d\n", re0.NumSubexp())
re := regexp.MustCompile(`(.*)((a)b)(.*)a`)
fmt.Println(re.NumSubexp())
Результат:
0 4
func (*Regexp) ReplaceAll
func (re *Regexp) ReplaceAll(src, repl []byte) []byte
ReplaceAll возвращает копию src, заменяя совпадения Regexp текстом замены repl. Внутри repl знаки $ интерпретируются так же, как в Regexp.Expand.
Пример
Код:
re := regexp.MustCompile(`a(x*)b`)
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("T")))
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1")))
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("$1W")))
fmt.Printf("%s\n", re.ReplaceAll([]byte("-ab-axxb-"), []byte("${1}W")))
re2 := regexp.MustCompile(`a(?P<1W>x*)b`)
fmt.Printf("%s\n", re2.ReplaceAll([]byte("-ab-axxb-"), []byte("$1W")))
fmt.Printf("%s\n", re2.ReplaceAll([]byte("-ab-axxb-"), []byte("${1}W")))
Результат:
-T-T- --xx- --- -W-xxW- --xx- -W-xxW-
func (*Regexp) ReplaceAllFunc
func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte
ReplaceAllFunc возвращает копию src, в которой все совпадения Regexp заменены значением, возвращённым функцией repl, применённой к совпавшему срезу байтов. Возвращённая repl замена подставляется напрямую, без использования Regexp.Expand.
func (*Regexp) ReplaceAllLiteral
func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte
ReplaceAllLiteral возвращает копию src, заменяя совпадения Regexp байтами замены repl. Замена repl подставляется напрямую, без использования Regexp.Expand.
func (*Regexp) ReplaceAllLiteralString
func (re *Regexp) ReplaceAllLiteralString(src, repl string) string
ReplaceAllLiteralString возвращает копию src, заменяя совпадения Regexp строкой замены repl. Замена repl подставляется напрямую, без использования Regexp.Expand.
Пример
Код:
re := regexp.MustCompile(`a(x*)b`)
fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "T"))
fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "$1"))
fmt.Println(re.ReplaceAllLiteralString("-ab-axxb-", "${1}"))
Результат:
-T-T-
-$1-$1-
-${1}-${1}-
func (*Regexp) ReplaceAllString
func (re *Regexp) ReplaceAllString(src, repl string) string
ReplaceAllString возвращает копию src, заменяя совпадения Regexp строкой замены repl. Внутри repl знаки $ интерпретируются так же, как в Regexp.Expand.
Пример
Код:
re := regexp.MustCompile(`a(x*)b`)
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W"))
re2 := regexp.MustCompile(`a(?P<1W>x*)b`)
fmt.Printf("%s\n", re2.ReplaceAllString("-ab-axxb-", "$1W"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W"))
Результат:
-T-T- --xx- --- -W-xxW- --xx- -W-xxW-
func (*Regexp) ReplaceAllStringFunc
func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string
ReplaceAllStringFunc возвращает копию src, в которой все совпадения Regexp заменены значением, возвращённым функцией repl, применённой к совпавшей подстроке. Возвращённая repl замена подставляется напрямую, без использования Regexp.Expand.
Пример
Код:
re := regexp.MustCompile(`[^aeiou]`)
fmt.Println(re.ReplaceAllStringFunc("seafood fool", strings.ToUpper))
Результат:
SeaFooD FooL
func (*Regexp) Split 1.1
func (re *Regexp) Split(s string, n int) []string
Split разбивает s на подстроки, разделённые выражением, и возвращает срез подстрок, расположенных между совпадениями с этим выражением.
Срез, возвращаемый этим методом, состоит из всех подстрок s, не входящих в срез, возвращаемый методом Regexp.FindAllString. При вызове для выражения, не содержащего метасимволов, метод эквивалентен strings.SplitN.
Пример:
s := regexp.MustCompile("a*").Split("abaabaccadaaae", 5)
// s: ["", "b", "b", "c", "cadaaae"]
Количество определяет число возвращаемых подстрок:
- n > 0: не более n подстрок; последняя подстрока будет оставшейся частью без разделения;
- n == 0: результат равен nil (ноль подстрок);
- n < 0: все подстроки.
Пример
Код:
a := regexp.MustCompile(`a`)
fmt.Println(a.Split("banana", -1))
fmt.Println(a.Split("banana", 0))
fmt.Println(a.Split("banana", 1))
fmt.Println(a.Split("banana", 2))
zp := regexp.MustCompile(`z+`)
fmt.Println(zp.Split("pizza", -1))
fmt.Println(zp.Split("pizza", 0))
fmt.Println(zp.Split("pizza", 1))
fmt.Println(zp.Split("pizza", 2))
Результат:
[b n n ] [] [banana] [b nana] [pi a] [] [pizza] [pi a]
func (*Regexp) String
func (re *Regexp) String() string
String возвращает исходный текст, использованный для компиляции регулярного выражения.
func (*Regexp) SubexpIndex 1.15
func (re *Regexp) SubexpIndex(name string) int
SubexpIndex возвращает индекс первого подвыражения с указанным именем или -1, если подвыражения с таким именем нет.
Обратите внимание, что несколько подвыражений могут иметь одинаковое имя, как в выражении (?P<bob>a+)(?P<bob>b+), которое объявляет два подвыражения с именем "bob". В этом случае SubexpIndex возвращает индекс самого левого такого подвыражения в регулярном выражении.
Пример
Код:
re := regexp.MustCompile(`(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)`)
fmt.Println(re.MatchString("Alan Turing"))
matches := re.FindStringSubmatch("Alan Turing")
lastIndex := re.SubexpIndex("last")
fmt.Printf("last => %d\n", lastIndex)
fmt.Println(matches[lastIndex])
Результат:
true last => 2 Turing
func (*Regexp) SubexpNames
func (re *Regexp) SubexpNames() []string
SubexpNames возвращает имена подвыражений в скобках в этом Regexp. Имя первого подвыражения находится в names[1], поэтому, если m — срез совпадений, имя для m[i] находится в SubexpNames()[i]. Поскольку всему Regexp нельзя присвоить имя, names[0] всегда является пустой строкой. Не следует изменять этот срез.
Пример
Код:
re := regexp.MustCompile(`(?P<first>[a-zA-Z]+) (?P<last>[a-zA-Z]+)`)
fmt.Println(re.MatchString("Alan Turing"))
fmt.Printf("%q\n", re.SubexpNames())
reversed := fmt.Sprintf("${%s} ${%s}", re.SubexpNames()[2], re.SubexpNames()[1])
fmt.Println(reversed)
fmt.Println(re.ReplaceAllString("Alan Turing", reversed))
Результат:
true
["" "first" "last"]
${last} ${first}
Turing Alan
func (*Regexp) UnmarshalText 1.21
func (re *Regexp) UnmarshalText(text []byte) error
UnmarshalText реализует encoding.TextUnmarshaler, вызывая Compile для закодированного значения.
Подкаталоги
| Имя | Краткое описание |
|---|---|
| .. | |
| syntax | Пакет syntax разбирает регулярные выражения в деревья разбора и компилирует деревья разбора в программы. |
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/regexp/