#yyds干货盘点#正则表达式校验汉字

时间:2023-02-21 11:16:47

IOS10下的汉字校验出现问题,使用的是汉字校验社区方案:

​/\p{Unified_Ideograph}/u​

以下用的'ji'表示汉字:

#yyds干货盘点#正则表达式校验汉字

社区方案

const data1 = '我是';
const data2 = 'ji龿';

const pattern1 = /^[\u4e00-\u9fd5]{1,6}$/gu; // null
const pattern2 = /^[\u4e00-\u9fff]{1,6}$/gu; // null
const pattern3 = /^\p{Unified_Ideograph}{0,6}$/gu; // ['ji龿'] IOS10有问题
const pattern4 = /^\p{sc=Han}{1,6}$/gu;//['ji龿'] IOS10有问题

// 测试常见汉字 -> 全部正常
console.log(data1.match(pattern1));
console.log(data1.match(pattern2));
console.log(data1.match(pattern3));
console.log(data1.match(pattern4));

// 测试生僻字
console.log(data1.match(pattern1)); // null
console.log(data1.match(pattern2));// null
console.log(data1.match(pattern3)); // ['ji龿']
console.log(data1.match(pattern4));// ['ji龿']

结论

  • ​[\u4e00-\u9fd5]​​的匹配方式不能覆盖全部汉字
  • 即使使用​​[\u4e00-\u9fff]​​仍然不能覆盖全部
  • ​\p{Unified_Ideograph}​​ 和 ​​\p{sc=Han}​​ 两种社区方案可以覆盖全部
    你以为这样就完了吗?
    ​\p{Unified_Ideograph}​​ 和 ​​\p{sc=Han}​​ 这种指定Unicode Script 在​​IOS10​​下不能正常运行!!!

好的解决方案:降级处理

validateChinese (input = '') {
try {
const pattern = new RegExp('^\\p{Unified_Ideograph}{1,6}$', 'gu')
return input.match(pattern)
} catch (e) {
// 降级处理,会有部分汉字匹配不全
const pattern = /^[\u4e00-\u9fff]{1,6}$/g
return input.match(pattern)
}
},

待解决

降级使用 ​​[\u4e00-\u9fff]​​ 后汉字长度的问题。一个汉字的长度可能是1,也可能是2(比如‘'ji’)。