用Go解释这个正则表达式的含义

3

主包

考虑以下代码:

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[A-Z]*")
    fmt.Println(re.ReplaceAllString("ABcd", "."))
}

输出结果为:

.c.d.

我在regexpal上测试了我的正则表达式和字符串。它应该只匹配AB。为什么它会在cd之间匹配并插入一个.呢?

2个回答

5

ABcd字符串在正则表达式引擎中被视为

EMPTY_STRING A EMPTY_STRING B EMPTY_STRING c EMPTY_STRING d EMPTY_STRING

[A-Z]* 匹配 零个或多个 ASCII 大写字母。也就是说,它可以匹配 EMTPY_STRING(空字符串)。工作原理如下:

EMPTY_STRING A EMPTY_STRING B EMPTY_STRING c EMPTY_STRING d EMPTY_STRING
| ------------- First match ------------ |   |-2nd one-|    |-3rd one-|

导致结果为.c.d.

因此,您应该考虑使用+{1,}量词而不是*(= {0,})。


4
你的正则表达式中的*匹配大写字母的零个或多个出现次数,在初始的两个(A和B)后面有两个大写字母。 将其改为+以匹配一个或多个出现次数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接