如何匹配包含unicode字符的完整字符串?

How to match a complete string containing unicode characters?

我想验证一个字符串,例如姓名。没有空格的字符串。对于普通的 Ascii,以下正则表达式就足够了 "^\w+$",其中 ^ 和 $ 考虑了整个字符串。我尝试使用 \pL 字符 class 为支持多种语言的 unicode 字符实现相同的结果。但由于某种原因 $ 不能帮助匹配字符串的结尾。我究竟做错了什么?

代码示例在这里:https://play.golang.org/p/SPDEbWmqx0N

我从以下位置复制粘贴的随机字符:http://www.columbia.edu/~fdc/utf8/

go版本go1.12.5darwin/amd64

package main

import (
    "fmt"
    "regexp"
)

func main() {

    // Unicode character class

    fmt.Println(regexp.MatchString(`^\pL+$`, "testuser"))  // expected true
    fmt.Println(regexp.MatchString(`^\pL+$`, "user with space")) // expected false 


    // Hindi script
    fmt.Println(regexp.MatchString(`^\pL+$`, "सकता")) // expected true doesn't match end of line

    // Hindi script
    fmt.Println(regexp.MatchString(`^\pL+`, "सकता")) // expected true

    // Chinese
    fmt.Println(regexp.MatchString(`^\pL+$`, "我能")) // expected true

    //French
    fmt.Println(regexp.MatchString(`^\pL+$`, "ægithaleshâtifs")) // expected true 

}
actual result:
true  <nil>
false <nil>
false <nil>
true <nil>
true <nil>
true <nil>

expected result:
true <nil>
false <nil>
true <nil>
true <nil>
true <nil>
true <nil>

您可以使用

^[\p{L}\p{M}]+$

参见Go demo

详情

  • ^ - 字符串开头
  • [ - 匹配的字符 class 的开头
    • \p{L} - 任何 BMP 字母
    • \p{M} - 任何变音符号
  • ]+ - 字符结束class,重复1+次
  • $ - 字符串结尾。

如果您打算像 \w 一样匹配数字和 _,请将它们添加到字符 class、^[\p{L}\p{M}0-9_]+$^[\p{L}\p{M}\p{N}_]+$