7

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

 1 year ago
source link: https://blog.51cto.com/u_11365839/6075438
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

精选 原创

尼羲 2023-02-21 09:08:48 博主文章分类:技术扯淡 ©著作权

文章标签 待解决 解决方案 文章分类 JavaScript 前端开发 yyds干货盘点 阅读数133

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

  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK