正则表达式查找中文Unicode字符

4
我有这样的代码
re, err = regexp.Compile(`\p{Han}*`)
if err != nil {
    fmt.Println(err)
    return
}
s := "foo中文哦woqu"
fmt.Println(re.FindString(s))

但是它打印为空。

然后我将\p{Han}*更改为\p{Han}+,它显示“中文哦”。

\p{Han}*更改为\p{Han}?,它打印为空。

我找到了这样的文档:

  • x* 零个或多个x,更倾向于多个
  • x+ 一个或多个x,更倾向于多个
  • x? 零个或一个x,更倾向于一个

所以我期望我的打印结果是:

  • \p{Han}* 打印“中文哦”
  • \p{Han}+ 打印“中文哦”
  • \p{Han}? 打印“中”

有人能告诉我发生了什么吗?


如果您想查找字符,只需使用 {Han} 而不需要其他。 - Tornike
re,err = regexp.Compile(`{Han}`) 像这样?它也会打印空的。 - sydnash
像这样: regexp.Compile(\\p{Han}`)` - Tornike
这只能匹配一个字符。我想匹配更多的字符。 - sydnash
1个回答

4
作为文档所述(强调添加):

FindString返回一个字符串,其中包含正则表达式在s中最左匹配的文本。如果没有匹配项,则返回值为空字符串,但是如果正则表达式成功匹配空字符串,返回值也将为空。如果需要区分这些情况,请使用FindStringIndex或FindStringSubmatch。

\p{Han}*匹配一个空字符串。您还可以通过使用FindAllString来查看:
fmt.Printf("%q", re.FindAllString(s, -1))
// Prints ["" "" "" "中文哦" "" "" "" ""]

您可以使用\p{Han}+,它不匹配空字符串。

我认为我明白发生了什么:因为 * 和 ? 也匹配空字符串,所以 find 方法打印第一个匹配的空字符串,感谢回复。 - sydnash

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