仅匹配 Unicode 字母

IT技术 javascript regex
2021-01-23 21:55:45

我有以下只允许字母的正则表达式:

     /[a-zA-Z]+/

     a = "abcDF"
     if (a.match(/[a-zA-Z]+/) == a){
        //Match
     }else{
        //No Match
     } 

我如何使用 p{L}(通用 - 任何语言,如德语、英语等......)

我试过的:

  a.match(/[p{l}]+/)
  a.match(/[\p{l}]+/)
  a.match(/p{l}/)
  a.match(/\p{l}/)

但是对于字母 a = "aB" 都返回 null

3个回答

从 ECMAScript 2018 开始,JavaScript 终于原生支持Unicode 属性转义

对于旧版本,您需要自己定义所有相关的 Unicode 范围。或者,您可以将 Steven Levithan 的XRegExp包与 Unicode 附加组件一起使用,并利用其 Unicode 属性快捷方式:

var regex = new XRegExp("^\\p{L}*$")
var a = "abcäöüéèê"
if (regex.test(a)) {
    // Match
} else {
    // No Match
}
有人告诉我 \w 匹配任何语言,是真的吗?
2021-03-15 21:55:45
@user1767962:这会很难,因为你会发现德语单词使用重音字母,英语单词使用“umlauts”(trema)等,所以语言和它们的“允许”之间没有明确的界限字符集。
2021-03-17 21:55:45
两个反斜杠的 ^\\p{L}*$ bcoz 的无效转义字符错误。这是一个错字吗?
2021-03-18 21:55:45
\w只匹配 JavaScript 中的 ASCII 字母/数字/下划线。如果您想支持 Unicode,没有简单的方法可以绕过 XRegExp。
2021-04-04 21:55:45
我在使用包时没有问题,但只是告诉我,是否必须使用包来检查不同的语言,如德语、英语等。
2021-04-07 21:55:45

如果你愿意使用Babel来构建你的 javascript,那么我发布了一个 babel-plugin,它可以将正则表达式像/^\p{L}+$//\p{^White_Space}/转换成浏览器可以理解的正则表达式。

这是项目页面:https : //github.com/danielberndt/babel-plugin-utf-8-regex

您可以\p{L}与现代 ECMAScript 2018+兼容的 JavaScript 环境一起使用,但您需要记住,只有在传递u修饰符/标志时才支持 Unicode 属性类

a.match(/\p{L}+/gu)
a.match(/\p{Alphabetic}+/gu)

将匹配a字符串中所有出现的 1 个或多个 Unicode 字母

注意的是\p{Alphabetic}\p{Alpha})包括匹配所有字母\p{L},再加上字母数字的匹配\p{Nl}(如-为罗马数字字符12),加上匹配的一些其他符号\p{Other_Alphabetic}\p{OAlpha})。

但是在使用u带有正则表达式的修饰符时,有一些事情需要牢记

  • 您可以使用 Unicode 代码点转义序列,例如\u{1F42A}通过代码点指定字符。普通的 Unicode 转义,例如\u03B1只有四个十六进制数字的范围(等于基本的多语言平面)(来源
  • "正确处理 4 个字节的字符:作为单个字符,而不是两个 2 字节字符"(来源
  • 对使用uflag编译的模式的转义要求更加严格:您不能转义任何特殊字符,只能转义那些实际上可以充当特殊字符的字符。请参阅HTML 输入模式不起作用
这在 Chrome 89 中有效,但if ('ıi和平'.match(/\p{Alphabetic}+/gu)) {console.log('true!');} else {console.log('false!');}在 Waterfox 56 中似乎无效,请问?
2021-03-19 21:55:45
@约翰如果ECMAScript的2018还不支持在那里,你将需要一个解决方法,如描述在这里
2021-04-10 21:55:45