При работе в качестве сканера часто необходимо выполнять текстовый поиск по просканированному содержимому, и в этом случае использование регулярных выражений для сопоставления с образцом является элегантным подходом.
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 | соответствует любому символу, не являющемуся словом |