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

时间:2019-07-31 09:47:27

标签: regex go re2

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

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

我从http://www.columbia.edu/~fdc/utf8/

复制粘贴的随机字符

go版本 go1.12.5 darwin / 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>

1 个答案:

答案 0 :(得分:2)

您可以使用

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

请参见Go demo

详细信息

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

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