关于javascript:正则表达式校验汉字

背景

IOS10下的汉字校验呈现问题:
/\p{Unified_Ideograph}/u

以下用的’ji’示意汉字:

社区计划

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’)。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理