如何过滤字符串仅保留含中日等非拉丁语系的字母数字类字符?
解决方案
问题分析
你的现有正则有两个核心问题:
- 仅匹配字符串末尾的非法字符(
+$限制了匹配范围),中间的非法字符(比如=、表情)不会被处理; - 只包含了中文(
\p{Han}),未覆盖日文等其他非拉丁语系字符。
简洁实现
根据需求,我们可以利用Unicode属性类快速实现,以下两种方案任选:
方案1:精准指定保留的字符类别
保留拉丁语字母、数字、中文、日文(平假名/片假名),过滤其他字符:
let string = 'Test=😕查看 カタカナ ひらがな 123'; // 替换所有非法字符为空 string = string.replace(/[^\p{Alnum}\p{Han}\p{Hiragana}\p{Katakana}]/gu, ''); // 若需将连续非法字符替换为单个空格,用这个: // string = string.replace(/[^\p{Alnum}\p{Han}\p{Hiragana}\p{Katakana}]+/gu, ' '); console.log(string); // 输出:Test查看カタカナひらがな123
方案2:宽泛匹配所有语言的字母数字(更简洁)
\p{Alnum}是Unicode属性类,自动匹配所有语言的字母和数字(包括中文、日文、韩文等),完全满足你的需求:
let string = 'Test=😕查看 カタカナ ひらがな 123'; string = string.replace(/[^\p{Alnum}]/gu, ''); // 如需保留空格,可改为 /[^\p{Alnum}\s]/gu console.log(string); // 输出:Test查看カタカナひらがな123
关键说明
u修饰符必须添加,否则无法识别Unicode属性类;g修饰符实现全局匹配,确保所有位置的非法字符都被处理;- 如果需要保留特定符号(比如空格),直接将其加入正则的允许字符集即可。
内容的提问来源于stack exchange,提问作者Mr. Jo
相关产品推荐
相关产品推荐

