regex 总览待审核
RGI · Flag / Tag / Modifier

RGI:国旗 / 子地区旗 / 肤色,与 \p{RGI_Emoji}

RGI = Recommended for General Interchange。并非所有理论上合法的 emoji 序列都能在各平台正常显示, Unicode 因此圈定一个子集 RGI:其一 标准认可;其二 Apple / Google / Microsoft / Samsung 等通常都支持; 其三 可在不同系统间可靠传输。Basic_Emoji 是 RGI_Emoji 的子集(历史上先有 Basic,后扩成 RGI)。 日常业务直接用 \p{RGI_Emoji} 即可。这页拆开它下面几类序列

国旗 = 两个 Regional Indicator

\p{RGI_Emoji_Flag_Sequence}:区域码 U+1F1E6 ~ U+1F1FF 共 26 个(对应 a~z), 两个拼成一面国旗(ISO 3166 双字母)。挑两个字母拼:

🇨🇳 = U+1F1E8(C)+ U+1F1F3(N)。逻辑层写 \u{1F1E8}\u{1F1F3}, 存储层(UTF-16)写 🇨🇳 —— 每个区域码都是补充平面字符,各占一个代理对(见「code point / UTF-16」那页)。 ⚠️ 同一序列,渲不渲染由平台决定。\p{RGI_Emoji_Flag_Sequence} 只管「这两个区域码是不是合法 RGI 国旗」, 至于显不显示成旗子则是字体 / 系统层的事——出于政治因素,中国大陆区域的系统(iOS / 部分 Android)不渲染 TW(U+1F1F9 T + U+1F1FC W)国旗,只回退成两个 Regional Indicator 字母方块 🇹🇼。 正则仍判它合法,但你眼睛看到的可能不是旗子。各平台到底长什么样,可到 Full Emoji List 逐厂商对照。

子地区旗 = 黑旗 + Tag 标签

\p{RGI_Emoji_Tag_Sequence}:用 U+E0020 ... U+E007E(96 个,和 ASCII 可打印字符一一对应) 给黑旗 🏴 贴「标签」,不新增大量码点就扩展出子地区旗。末尾用 U+E007F(cancel tag)收尾。

拆解:黑旗基底 + tag 字符(对应 ASCII)+ cancel

肤色 = 基础 emoji + 修饰符

\p{RGI_Emoji_Modifier_Sequence} = 支持修饰符的 Basic_Emoji + 肤色修饰符。 目前 5 种肤色:U+1F3FB(light)… U+1F3FF(dark)。 约束:只能用于人 / 身体部位 / 人类动作 类 emoji。

整体匹配:/\p{RGI_Emoji}/v

\p{RGI_Emoji} 匹配一个完整的 RGI emoji——上面所有序列(单码点 / VS16 / ZWJ / 国旗 / Tag / 肤色) 它都认。这就是日常业务该用的那一个。输入一段混合文本,看它把每个完整 emoji 整段框出来: