Golang Regex:了解正则表达式中的大括号

964 阅读3分钟

概述

大括号在 regex 中充当重复量词。它们指定一个字符在输入字符串或文本中出现的次数。它们也可以用来指定一个范围,即指定一个字符可以出现的最小和最大次数。

其语法为

{min, max}

其中

  • min表示一个字符可以出现的最小次数

  • max表示一个字符可以出现的最大次数。

比如说

a{n}

这表明字符 "a "正好可以出现n次。类似的还有下面这个词组

\d{n}

指定任何数字可以出现n次。 大括号也可以用来定义一个范围。
例如

  • {m,n}- 至少有m次**,**最多有n次

  • {m, }- 至少出现m次

  • {, n}--最多n次

让我们看一个同样的例子

例子

package main

import (
	"fmt"
	"regexp"
)

func main() {
	sampleRegexp := regexp.MustCompile(`b{2}`)

	matches := sampleRegexp.FindString("bb")
	fmt.Println(matches)

	matches = sampleRegexp.FindString("bbb")
	fmt.Println(matches)

	matches = sampleRegexp.FindString("bbbb")
	fmt.Println(matches)
}

输出

bb
bb
bb

默认情况下,大括号是贪婪或不贪婪的。这是什么意思?它们会匹配所有可能的字符,并且总是倾向于更多。也可以使大括号运算符不贪婪或懒惰。这可以通过在大括号运算符后面添加一个问号来实现。让我们看一个同样的例子。

你可以从输出中看到,在大括号运算符后添加一个问号运算符后,它试图尽可能地匹配最少的字符,即它变得不贪婪。

这就是为什么给定的regex

ab{2,4}

它对以下所有的输入字符串给出了一个匹配abb

abb
abbb
abbbb

同样的程序

package main

import (
    "fmt"
    "regexp"
)

func main() {
    sampleRegexp := regexp.MustCompile(`ab{2,4}`)

    matches := sampleRegexp.FindStringSubmatch("abb")
    fmt.Println(matches)

    matches = sampleRegexp.FindStringSubmatch("abbb")
    fmt.Println(matches)

    matches = sampleRegexp.FindStringSubmatch("abbbb")
    fmt.Println(matches)
}

输出

abb
abbb
abbbb

ab{2,4}?对上述所有的输入字符串总是给出abb的匹配结果。

同样的程序

package main

import (
	"fmt"
	"regexp"
)

func main() {
	sampleRegexp := regexp.MustCompile(`ab{2,4}?`)

	matches := sampleRegexp.FindString("abb")
	fmt.Println(matches)

	matches = sampleRegexp.FindString("abbb")
	fmt.Println(matches)

	matches = sampleRegexp.FindString("abbbb")
	fmt.Println(matches)
}

输出

abb
abb
abb

应用于分组的大括号

正则表达式的一部分可以放在平衡小括号内。这一部分现在是一个组。我们可以另外对这个组应用大括号。大括号将被添加到分组的后面。

让我们看一个同样的例子。

package main

import (
	"fmt"
	"regexp"
)

func main() {
	sampleRegexp := regexp.MustCompile(`(ab){2}`)

	matches := sampleRegexp.FindString("abab")
	fmt.Println(matches)

	matches = sampleRegexp.FindString("ababbc")
	fmt.Println(matches)
}

输出

abab
abab

大括号应用于一个字符类

大括号量词也可以应用于整个字符类。不过它的含义仍然是一样的。一个字符类在regex中用方括号表示。让我们看一个同样的程序。

在上面的程序中,我们有如下的regex

[ab]{4}

这意味着它将匹配一个长度正好为4的字符串,并且由任何顺序 的字符**'a'和'**b'组成。

这就是为什么这个词组会匹配以下的字符串

abab
aaaa
bbbb
aabb
bbaa

而它不匹配

aba - String of length 3
abbaa - String of length 5

如何在regex中使用大括号作为一个字面字符

如果需要在字面上使用,转义字符可以放在开括号或闭括号之前。

没有在开头的闭合大括号之前的闭合大括号被视为字面的闭合大括号。

以上就是关于golang中的大括号的全部内容。希望你喜欢这篇文章。请在评论中分享反馈