如何让C#正则表达式正确识别Unicode字符完成末尾内容匹配替换?
你遇到的现象和UTF-8编码无关,根源是C#的字符串采用UTF-16编码存储:单个char类型占16位,只能表示U+0000~U+FFFF范围内的Unicode字符,而绝大多数emoji属于U+10000及以上的Unicode码位,会用两个char(高位代理+低位代理)拼接存储。正则中的.默认匹配单个char,所以单个emoji会被判定为2个字符,才会出现需要写两个.才能匹配的情况。
方案1:.NET 6及以上版本(推荐)
.NET 6开始正则支持\X转义符,专门用于匹配单个完整的Unicode字位簇,不管它占用几个char,适配普通字符、emoji、带组合标记的特殊字符等所有场景。
修改后的代码如下:
sText = Regex.Replace(sText, @"\| \X$", "");
方案2:兼容低版本.NET
如果使用的是.NET 6以下的版本,可以手动写代理对匹配逻辑,同时兼容普通字符和代理对形式的特殊字符:
// 匹配要么是单个普通字符,要么是一对代理对(emoji等特殊字符) sText = Regex.Replace(sText, @"\| (?:[\uD800-\uDBFF][\uDC00-\uDFFF]|.)$", "");
两种方案都可以同时适配普通字符和emoji场景,不需要额外做编码转换,只要你从HttpClient获取字符串时已经正确用UTF-8解码得到正常的C#字符串即可。
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

