使用 ES9 的 “RegExp Unicode Property Escapes” 构建强壮的验证器

阅读时长 4 分钟读完

在前端开发中,我们经常需要验证用户输入的表单数据,例如邮箱、密码、电话号码等。而使用正则表达式是一种便捷、高效的方式来实现数据格式验证。近期发行的 ECMAScript 2018(简称 ES9)标准新增了一种功能 - “RegExp Unicode Property Escapes”,也称为“Unicode 属性转义”,大大提高了正则表达式的匹配能力。

什么是 Unicode 属性转义

在之前的正则表达式匹配中,我们使用 \d 来代表任意数字,但并不包括某些国家特有的数字字符集。与此类似,\w 只能匹配英文字母、数字和下划线,而不能匹配其他语言或符号。而 Unicode 属性转义主要解决这个问题。

Unicode 属性转义以 \p{} 的形式,后面跟随属性名或者属性值,比如:

  • \p{Script=Hebrew}:匹配任意希伯来语字符。
  • \p{Alphabetic}:匹配任意字母字符。

甚至还可以结合其他正则表达式语法,比如正负预查、量词等进行复杂匹配,例如:

  • (?<=\p{Script=Latin})[A-Z]:匹配拉丁字符集里的大写字母。
  • \p{Letter}{4}\p{Number}{4}:匹配形如“abcd1234”的 8 位字符组合。

这些属性或属性值,可以从 Unicode Technical Report(UTR#51)里查找到。这个“Unicode 通用字符集”包含了多种语言文字、数学符号、货币符号等。添加这种用法标准,只是为了解决类似于验证国家特有数字和字符、中文、日语等的场景。

如何使用

接下来,我们将通过代码实现,展示如何使用 Unicode 属性转义构建强壮的数据验证器。

假设我们需要验证用户输入的电话号码。在以前,我们可以使用类似于以下的正则表达式:

这个表达式可以满足绝大多数情况下的号码格式,但是确实不适合国际电话号码或者公司内部电话。现在有了 Unicode,我们可以根据各种国家或地区的 numeralSystem(数字系统)属性,来匹配不同数字字符集。例如我们可以构建以下的验证器:

-- -------------------- ---- -------
----- ----------- - ------------ - ----- -- -
    ----- -------- - -
        ----- ----------------------------
        ----- ----------------------------
        ----- ------------------------
        ----- -------------------------
        ----- ----------------------
    --
    ------ --- -----------------------------------------------------
-

上面的代码中,我们假设国际代码默认为中国,根据国家代码 country 来匹配其对应手机号码的数字系统。中国采用了十进制数字,而美国采用了数字系统。日本使用了汉字数字等。印度则使用了天城文数字等。

该代码可以很好地实现对于国家特有的电话号码验证的转义。当我们使用时,只需要输入对应的国家代码,即可构建对应的号码校验器:

以上代码,更好的实现了全球性质的国际电话检测,而不仅局限于一些常规格式的电话检测。

总结

相信通过上述的讲解,大家对于 Unicode 属性转义的基本操作有了一定的了解。掌握了这种强大的匹配方式之后,我们在实现表单验证或者数据表格等等需求时,可以更便捷、高效地验证数据合法性。其实很多开源组件自己底层里封装了这种操作,让世界代码变得更简单、快速。推荐大家使用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645222da675af4061b5ca84c

纠错
反馈