主包
考虑以下代码:
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile("[A-Z]*")
fmt.Println(re.ReplaceAllString("ABcd", "."))
}
输出结果为:
.c.d.
我在regexpal上测试了我的正则表达式和字符串。它应该只匹配AB
。为什么它会在c
和d
之间匹配并插入一个.
呢?
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,}
)。
*
匹配大写字母的零个或多个出现次数,在初始的两个(A和B)后面有两个大写字母。
将其改为+
以匹配一个或多个出现次数。