如何使用 JavaScript/jQuery 正则表达式匹配非 ASCII 字符?
要匹配非 ASCII 字符(即 Unicode 编码范围之外的字符,ASCII 字符编码范围是
0x00到0x7F,也就是十进制的 0 到 127),可以使用 JavaScript 和正则表达式中的 Unicode 字符集支持。
方案 1:使用正则表达式
JavaScript 支持正则表达式的范围表示法,可以使用 [\x00-\x7F] 表示 ASCII 字符范围,因此非 ASCII 字符可以通过反向匹配 [^] 表示。
匹配非 ASCII 字符
const nonAsciiPattern = /[^\x00-\x7F]/g;
const text = "Hello, 世界!";
const nonAsciiChars = text.match(nonAsciiPattern);
console.log(nonAsciiChars); // 输出 ["世", "界"]
方案 2:使用 Unicode 属性转义(现代方法)
从 ECMAScript 2018(ES9)开始,正则表达式支持 Unicode 属性转义,通过 \p{} 表示 Unicode 属性。要匹配非 ASCII 字符,可以使用 \P{ASCII}。
匹配非 ASCII 字符
const nonAsciiPattern = /\P{ASCII}/gu; // 注意需要启用 `u` 修饰符支持 Unicode
const text = "Hello, 世界!";
const nonAsciiChars = text.match(nonAsciiPattern);
console.log(nonAsciiChars); // 输出 ["世", "界"]
关于 u 修饰符
u 修饰符是 Unicode 模式的标志,用于正确解析和匹配 Unicode 字符,特别是涉及到代理对(Surrogate Pairs)的字符。
区别
- 使用
[\x00-\x7F]范围的方式兼容性更好,适用于老版本的 JavaScript 引擎。 - 使用
\P{ASCII}属性转义方式更简洁,但需要较新版本的 JavaScript 引擎支持。
使用场景举例
1. 检查字符串中是否包含非 ASCII 字符
const containsNonAscii = text => /[^\x00-\x7F]/.test(text);
console.log(containsNonAscii("Hello, World!")); // false
console.log(containsNonAscii("你好,世界!")); // true
2. 替换所有非 ASCII 字符
const text = "Hello, 世界!";
const replacedText = text.replace(/[^\x00-\x7F]/g, '*');
console.log(replacedText); // 输出 "Hello, **!"
3. 提取所有非 ASCII 字符
const text = "Data: 样本数据123.";
const nonAsciiChars = text.match(/[^\x00-\x7F]/g) || [];
console.log(nonAsciiChars); // 输出 ["样", "本", "数", "据"]
注意事项
- 正则表达式的
[^]是反向匹配符。 \x00-\x7F指的是单字节 ASCII 字符,不包括多字节的 Unicode 字符。- 使用
\P{}属性转义时必须开启u修饰符,否则会导致语法错误。
总结
- 如果需要兼容性:推荐使用
[^\x00-\x7F]。 - 如果环境支持现代特性:推荐使用
\P{ASCII}。