如何使用XQuery移除文本内容中的Emoji表情符号?
错误原因
你原来的代码不生效是因为XQuery正则的转义规则和其他语言不同:XQuery遵循XML Schema正则规范,不支持无大括号的\x多字节转义格式,\x00-\xFFFF的写法会被识别为非法语法,无法匹配到目标Emoji字符。
你示例中的Emoji都属于Unicode补充多语言平面(SMP),码点范围在U+1F600到U+1F64F之间,远大于BMP平面上限U+FFFF,需要用正确的语法匹配这部分字符。
正确实现方案
方案1:适配你的示例场景(移除所有BMP平面外字符)
如果仅需要过滤掉所有码点大于U+FFFF的字符(你的示例中的Emoji都属于这类),修改正则转义格式即可:
replace($text, '[\x{10000}-\x{10FFFF}]', '')
运行后输入Hello 😀😃😄 üäö$会直接输出预期结果Hello üäö$。
方案2:精准移除所有Emoji(包含BMP平面内的Emoji)
如果需要同时过滤U+2600(太阳)、U+2702(剪刀)这类位于BMP平面内的Emoji字符,补充对应范围的匹配规则即可:
replace($text, '[\x{1F000}-\x{1F6FF}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{1F700}-\x{1F77F}\x{1F780}-\x{1F7FF}\x{1F800}-\x{1F8FF}\x{1F900}-\x{1F9FF}\x{1FA00}-\x{1FA6F}\x{1FA70}-\x{1FAFF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}]', '')
方案3:全版本兼容写法
如果使用的XQuery版本不支持正则的多字节转义,可以用码点遍历的方式实现过滤,兼容性更强:
string-join( for $codepoint in string-to-codepoints($text) where $codepoint <= 65535 (: 对应U+FFFF的十进制值 :) return codepoints-to-string($codepoint), '' )
内容的提问来源于stack exchange,提问作者Prem Sagar J
相关产品推荐
相关产品推荐

