仅匹配Unicode字母

17

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

[A-Za-z]+

     /[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个回答

13

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

对于旧版本,你要么需要自己定义所有相关的Unicode范围,要么可以使用Steven Levithan的XRegExp包与Unicode add-ons,并利用它的Unicode属性快捷方式:

var regex = new XRegExp("^\\p{L}*$")
var a = "abcäöüéèê"
if (regex.test(a)) {
    // Match
} else {
    // No Match
}

我在使用package方面没有问题,但是请问,检查不同语言(如德语、英语等)是否必须使用package? - user1767962
有人告诉我 \w 可以匹配任何语言,这是真的吗? - user1767962
1
在JavaScript中,\w只匹配ASCII字母/数字/下划线。如果您想支持Unicode,则没有简单的方法可以绕过XRegExp。 - Tim Pietzcker
@user1767962:这将是困难的,因为你会发现德语单词使用带重音符号的字母,英语单词使用“umlauts”(分音符)等,因此语言和它们“允许”的字符集之间没有明确的界限。 - Tim Pietzcker
1
由于有两个反斜杠,^\p{L}*$ 出现了无效的转义字符错误。这是一个打字错误吗? - user1767962
显示剩余5条评论

6
如果您愿意使用 Babel 来构建您的JavaScript,那么我发布了一个名为 babel-plugin-utf-8-regex 的插件,它将把正则表达式如/^\p{L}+$//\p{^White_Space}/转换成浏览器可以理解的正则表达式。
这是项目页面:https://github.com/danielberndt/babel-plugin-utf-8-regex

4
您可以在现代 ECMAScript 2018+ 兼容的 JavaScript 环境 中使用 \p{L},但需要记住,仅当您传递 u 修改器/标志时才支持 Unicode 属性类。
a.match(/\p{L}+/gu)
a.match(/\p{Alphabetic}+/gu)

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

注意\p{Alphabetic} (\p{Alpha}) 包括所有被 \p{L} 匹配的字母,还包括被 \p{Nl} (例如罗马数字 12 的字符 ) 匹配的“字母数字”,以及一些与 \p{Other_Alphabetic} (\p{OAlpha}) 匹配的其他符号。

但是,在使用带有正则表达式的 u 修饰符时,需要注意以下几点:

  • 您可以使用Unicode代码点转义序列,例如\u{1F42A}来通过代码点指定字符。普通的Unicode转义序列,如\u03B1只有四个十六进制数字的范围(相当于基本多语言平面)(source)
  • "4字节的字符被正确处理:作为单个字符,而不是两个2字节的字符" (source)
  • 使用u标志编译的模式的转义要求更严格:您不能转义任何特殊字符,只能转义那些实际上可以作为特殊字符的字符。请参见HTML输入模式无效

这在Chrome 89中有效,但是if ('ıi和平'.match(/\p{Alphabetic}+/gu)) {console.log('true!');} else {console.log('false!');}在Waterfox 56中似乎无效,请问您有什么想法? - John
@John 如果 ECMAScript 2018 在那里还没有得到支持,你需要一个解决方法,可以参考这里的描述。 - Wiktor Stribiżew

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