regexp 的 v 标志通过 unicode sets 实现精准语言过滤,核心是用脚本(如 \p{sc=han})、字符属性(如 \p{l})和区块(如 \p{blk=kangxi_radicals})作集合运算,支持 && 交集、-- 差集和 | 并集,需配合 u/v 标志及方括号内合法属性类使用。

直接用 RegExp 的 v 标志(Unicode Sets 模式)实现原始语言范围的精准过滤,核心是把语言脚本、字符属性、区块等抽象概念当作集合来运算,而不是靠模糊的范围拼接。
明确目标语言的 Unicode 脚本标识
每种自然语言在 Unicode 中基本对应一个或多个脚本(script),比如:
- 中文 →
\p{sc=Han} - 日文 →
\p{sc=Hiragana}、\p{sc=Katakana}、\p{sc=Han} - 韩文 →
\p{sc=Hangul} - 英文/法文/德文等拉丁系 →
\p{sc=Latn} - 阿拉伯文 →
\p{sc=Arab}
这些 \p{sc=...} 是合法的字符类,可直接参与集合运算,且必须配合 u 和 v 标志使用:/[\p{sc=Han}]/uv 就能匹配任意汉字(含扩展区)。
用 && 精确交集:只保留“既是字母又是某脚本”的字符
避免误吞标点、数字或控制符。例如,仅匹配“拉丁字母中的小写 ASCII 字母”:
-
/[\p{Ll}&&\p{ASCII}]/uv——\p{Ll}是小写字母,\p{ASCII}是 ASCII 区,交集即 a–z -
/[\p{L}&&\p{sc=Han}]/uv—— 所有汉字(排除 Han 脚本里的标点如「〇」「々」,因它们不属于\p{L}) -
/[\p{L}&&\p{sc=Hiragana}&&\p{gc=Ll}]/uv—— 仅平假名小写字母(排除浊音符号、长音符等非字母字符)
注意:所有 && 左右都必须是方括号内的字符类,不能写成 /[a-z&&\p{sc=Latn}]/uv(a-z 不是 Unicode 属性类,v 模式下非法)。
用 -- 做差集:从大范围中剔除干扰项
比如想匹配“所有汉字,但排除部首补充区和康熙部首”:
/[\p{sc=Han}--\p{blk=Kangxi_Radicals}--\p{blk=CJK_Radicals_Supplement}]/uv
又如过滤“拉丁脚本中所有字母,但去掉带重音的变体(只留 ASCII 字母)”:
-
/[\p{sc=Latn}&&\p{L}--\p{gc=Mn}]/uv(需配合预处理或更严谨地用\p{ASCII}差集) - 更稳妥写法:
/[\p{L}&&\p{sc=Latn}&&\p{ASCII}]/uv
差集操作支持链式,顺序不影响结果,但空集会导致整个字符类不匹配任何内容,需验证边界。
组合多脚本并集 + 条件交集:覆盖混合语言场景
真实文本常混用多种文字,比如中英夹杂、日英混排。可用 |(或)连接多个交集子表达式:
- 只允许中文、日文平假名/片假名、基础拉丁字母(不含重音):
/^(?:[\p{sc=Han}&&\p{L}]|[\p{sc=Hiragana}&&\p{L}]|[\p{sc=Katakana}&&\p{L}]|[\p{sc=Latn}&&\p{ASCII}&&\p{L}])*$/uv
注意:v 模式下 | 在字符类外才表示“或”,字符类内仍用并集逻辑(但推荐显式用多个 [] 并列加 | 更清晰)。实际使用时建议封装为函数,避免正则过长难维护。










