【发布时间】:2018-04-04 22:26:45
【问题描述】:
现在我正在使用这段代码:
public static bool ContainsEmoji(this string text)
{
Regex rgx = new Regex(@"\p{Cs}");
return rgx.IsMatch(text);
}
这有点帮助。
它们中的大多数似乎被检测到,但有些没有。
这里有一个帮助参考列表:http://unicode.org/emoji/charts/full-emoji-list.html
所有笑脸看起来都很好,但这些特定的表情符号不会被正则表达式捕获:
1920 U+2614 ☔ 带雨滴的雨伞
1921 U+26F1 ⛱ 地上雨伞
1922 U+26A1⚡高压
1923 U+2744 ❄ 雪花
在键盘上,它们彼此并不接近,但在列表中它们彼此跟随,所以我只是假设它在表情符号列表中开始不起作用,并且没有真正验证。从 1905 年开始(类似天气的表情符号),往下走,有些被正则表达式捕获,有些则没有。好像没有什么规定。
我不能只输入完整的 ASCII,因为我需要人们输入诸如西里尔字母之类的字符,但我不能专门接受表情符号。我不知道如何从这里继续前进。
我阅读了MSDN docs about surrogates high/low pairs,但在这个阶段,这让我很困惑,我认为朝着正确的方向推进会有很长的路要走。
非常感谢您的宝贵时间:)
【问题讨论】:
-
这些都不超过 U+10000,因此它们没有表示为代理对 - 正则表达式没有捕获它们也就不足为奇了。 (我不确定我是否会这样称呼它们。)
-
所有这些都在“符号,其他”(So)类别中,所以也许只是将其用作另一个类别。
-
@musefan 我不知道我错过了哪一个;作为第一次尝试,我在键盘中随机测试了一些,这些是我的结果。
-
另请注意,您捕获的不是“表情符号”而是代理对(当编码为 UTF16 时)。例如,您的正则表达式还将匹配一些韩语字符。
{Cs}等价于{Surrogate}。 AFAIK 没有用于表情符号的 Unicode 类别,那么您必须分别列出每个子范围。 -
@tetralobita 查看您刚刚链接的那个问题的答案的 cmets
标签: c# regex string char emoji