【发布时间】:2021-10-16 23:20:14
【问题描述】:
我使用 HttpClient 类从网站检索字符串。网络服务器以 UTF-8 编码发送它们。字符串的格式为abc | a,如果它们位于字符串的末尾,我想删除管道、空格和空格后面的字符。
sText = Regex.Replace (sText, @"\| .$", "");
按预期工作。现在,在某些情况下,管道和空格后面跟着另一个字符,例如笑脸。该字符串的格式为abc | ????。上面的正则表达式不起作用,我必须使用
sText = Regex.Replace (sText, @"\| ..$", "");
改为(两个点)。
我很确定这与编码以及笑脸在 UTF-8 中使用的字节数比拉丁字符多的事实有关 - 以及 c# 不知道编码的事实。笑脸只是一个字符,即使它使用更多字节,所以在告诉 c# 正确的编码(或转换字符串)后,第一个正则表达式应该适用于两种情况。
如何做到这一点?
【问题讨论】:
-
在 .NET 中将表情符号与正则表达式匹配存在很大问题,因为没有
\p{Emoji}构造。您所能做的就是定义regex for any emoji 或任何字节(.)。或者,如果您知道字符串中没有出现哪种字符并使用它来构建字符串模式的结尾,您可以解决它。 -
Wiktor @Magnetron(几乎)在他(不公平地被否决)已删除的答案中是正确的。
Regex.Replace(sText, @"\| (\p{Cs}{2}|.)$", "");应该作为.NET中的内部编码为UTF-16并且 BMP 之上的所有字符始终是两个代理项...... -
笑脸只是一个例子。我想删除 看起来 像一个项目的所有内容(一个字符、一个数字、一个符号......)。 \p{Cs}{2} 可能太有限了。