При работе в качестве сканера часто необходимо выполнять текстовый поиск по просканированному содержимому, и в этом случае использование регулярных выражений для сопоставления с образцом является элегантным подходом.
golang
стандартная библиотекаregexp
Обеспечивает связанное использование регулярных выражений.
правила синтаксиса регулярного выражения
Если вы хотите использовать регулярные выражения для прямого сопоставления с образцом, чаще всего используется прямое сопоставление.regexp.Match
функция иregexp.MatchString
функцию или использоватьRegexp
типы и связанные с ними методы.
regexp.Match
- определение:
func Match(pattern string, b []byte) (matched bool, err error)
Этот метод может определитьbyte slice
Соответствует ли регулярному выражению. возвращает совпадающие результаты иerror
.
- Пример:
matched, _ := regexp.Match("b", []byte("hello golang"))
fmt.Println(matched) // false
regexp.MatchString
- определение:
func Match(pattern string, s string) (matched bool, err error)
Этот метод может определитьstring
Соответствует ли регулярному выражению. возвращает совпадающие результаты иerror
.
- Пример:
matched, _ := regexp.MatchString("b", "hello golang")
fmt.Println(matched)
Regexp
Типы
- Определение типа:
type Regexp struct {}
Regexp
представляет собой скомпилированное регулярное выражение, которое может использоваться несколькимиgoroutines
Одновременное использование.
Regexp
Метод получения экземпляра типа, общие из нихCompile
а такжеMustCompile
.
Compile
Этот метод компилирует регулярное выражение и возвращает скомпилированный результат. Метод определяется как:
func Compile(expr string) (*Regexp, error)
MustCompile
этот метод иCompile
Очень похоже, но ошибка возникает, если компилятор не возвращает ошибку, но напрямуюpanic
.
Общие методы сопоставления Regexp
Regexp
Существует много методов сопоставления, наиболее распространенные из них перечислены ниже.
Find
Этот метод возвращает первое совпадение[]byte
.
- определяется как:
func (re *Regexp) Find(b []byte) []byte
- Пример:
re := regexp.MustCompile("a")
match := re.Find([]byte("hello golang"))
fmt.Println(string(match)) // a
FindAll
Этот метод возвращаетslice
.
- определяется как:
func (re *Regexp) FindAll(b []byte, n int) [][]byte
-
вернуть
slice
длина по параметруn
Уточнить:-
когда
n < 0
Когда , вернуть все совпадающие числа; -
когда
n >= 0
а такжеn <= 总匹配个数
,вернутьn
результат; -
когда
n > 总匹配个数
, который возвращает все результаты.
-
-
Пример:
re := regexp.MustCompile("l[a-z]")
match := re.FindAll([]byte("hello world, hello golang"), -1)
for _, m := range match {
fmt.Println(string(m))
}
// ll
// ld
// ll
// la
FindString
Этот метод возвращает совпадающую строку.
- определяется как:
func (re *Regexp) FindString (s string) string
- Пример:
re := regexp.MustCompile("l[a-z]")
match := re.FindString("hello world, hello golang")
fmt.Println(match) // ll
FindAllString
- определяется как:
func (re *Regexp) FindAllString(s string, n int) []string
Метод зависит от параметровn
, возвращает результат сопоставления или nil, если сопоставление не удалось
- Пример:
re := regexp.MustCompile("l[a-z]")
match := re.FindAllString("hello world, hello golang", -1)
for _, m := range match {
fmt.Println(string(m))
}
// ll
// ld
// ll
// la
FindIndex
Этот метод возвращает позицию первого совпадения в исходной строке.
- определяется как:
func (re *Regexp) FindIndex(b []byte) (loc []int)
loc[0]
- начальная позиция результата сопоставления,loc[1]
это конечная позиция результата сопоставления+1
, если совпадений не найдено, вернуть пустое значениеslice
.
- Пример:
re := regexp.MustCompile("l[a-z]")
match := re.FindIndex([]byte("hello world, hello golang"))
fmt.Println(match) // [2 4]
FinAllIndex
МетодFindIndex
изall
версия, основанная наn
Параметр определяет количество возвращаемых результатов.
- определяется как:
func (re *Regexp) FindAllIndex(b []byte, n int) [][]int
n
использование см.FindAll
.
- Пример:
re := regexp.MustCompile("l[a-z]")
match := re.FindAllIndex([]byte("hello world, hello golang"), -1)
for _, m := range match {
fmt.Println(m)
}
// [2 4] [9 11] [15 17] [21 23]
FindStringIndex
Эффект от этого метода такой же, какFindIndex
, но типы передаваемых параметров отличаются.
- определяется как:
func (re *Regexp) FindStringIndex(s string) (loc []int)
FindAllStringIndex
МетодFindStringIndex
изall
Версия.
- определяется как:
func (re *Regexp) FindAllStringIndex(s string, n int) [][]int
FindStringSubmatch
Этот метод возвращает совпадающую группу строк.
- определяется как:
func (re *Regexp) FindStringSubmatch(s string) []string
По описанию может быть сложно понять, что делает этот метод. Вот пример:
...
re := regexp.MustCompile(`(aaa)bb(c)`)
fmt.Printf("%q\n", re.FindStringSubmatch("aaabbc"))
Возвращаемый результат:
["aaabbc", "aaa", "c"]
FindAllStringSubmatch
МетодFindStringSubmatch
изall
Версия.
- Реализовано как:
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string
Match
Этот метод судитbyte slice
Соответствует ли регулярному выражению.
- определение:
func (re *Regexp) Match(b []byte) bool
- Пример:
re := regexp.MustCompile(`hello`)
match := re.Match([]byte("hello everyone"))
fmt.Println(match) // true
MatchString
Проверить, соответствует ли строка регулярному выражению.
- определение:
func (re *Regexp) MatchString(s string) bool
- Пример:
re := regexp.MustCompile(`hello`)
match := re.MatchString("hello everyone")
fmt.Println(match) // true
ReplaceAll
- определяется как:
func (re *Regexp) ReplaceAll(src, repl []byte) []byte
Метод возвращаетsrc
копия , все совпадения в этой копии будутrepl
заменять.
- Пример:
re := regexp.MustCompile(`hello`)
match := re.ReplaceAll([]byte("hello everyone"), []byte("hi!"))
fmt.Println(string(match)) // hi! everyone
ReplaceAllString
- определяется как:
func (re *Regexp) ReplaceAllString(src, repl string) string
Метод возвращаетsrc
копия , все вхождения этой копии будутrepl
заменять.
- Пример:
re := regexp.MustCompile(`hello`)
match := re.ReplaceAllString("hello everyone", "hi!")
fmt.Println(match) // hi! everyone
Split
- определяется как:
func (re *Regexp) Split(s string, n int) []string
Этот метод использует соответствующий элемент в качестве разделителя и будетs
Разделить на несколько строк и вернуть часть строк.
- Пример:
re := regexp.MustCompile(`a`)
s := re.Split("abacadaeafff", -1)
fmt.Println(s) // ["", "b", "c", "d", "e", "fff"]
-
параметр
n
управление возвращеноslice
длина:-
n > 0
: вернуть больше всегоn
строка, последняя - оставшаяся неразрезанная часть -
n == 0
:вернутьnil
-
n < 0
: вернуть все строки
-
Правила синтаксиса регулярных выражений
персонаж | описывать |
---|---|
^ | Соответствие строки начала позиции |
$ | Соответствует концу строки |
* | соответствует предыдущему подвыражению ноль или более раз |
+ | соответствует предыдущему подвыражению один или несколько раз |
? | соответствует предыдущему подвыражению ноль или один раз |
{n} | совпадение n раз |
{n,} | совпадение не менее n раз |
{n,m} | Совпадение не менее n раз и не более m раз |
? | Когда следует * + ? {n} {n.} {n,m}, это означает нежадное совпадение |
. | соответствует любому одиночному символу, кроме "\n" |
x|y | соответствует х или у |
[xyz] | соответствует любому символу, содержащемуся |
[^xyz] | соответствует не включенным символам |
[a-z] | Сопоставить диапазон символов |
[^a-z] | соответствует символам, не входящим в указанный диапазон |
\b | соответствовать границе слова |
\B | соответствовать границе не слова |
\d | соответствует числовому символу |
\D | соответствует нечисловому символу |
\f | соответствует фиду формы |
\n | соответствует новой строке |
\r | соответствует возврату каретки |
\s | соответствует любому символу пробела |
\S | соответствует любому непробельному символу |
\t | соответствует вкладке |
\v | соответствует вертикальной вкладке |
\w | Соответствовать любому символу слова, включая подчеркивание |
\W | соответствует любому символу, не являющемуся словом |