【问题标题】:Remove Emojis from String Rust从 String Rust 中删除表情符号
【发布时间】:2021-12-22 02:09:20
【问题描述】:

如何从"⚡hel✅????lo????" 之类的字符串中删除表情符号?

我知道您需要使用Regex 和其他一些东西,但我不确定如何编写语法并替换string 中的所有内容。

谢谢,非常感谢您的帮助。

【问题讨论】:

  • 第一步是定义“表情符号”的确切含义。您可能不想删除 Unicode 字符数据库中具有“表情符号”属性的所有字符,因为这将包括 # 和 * 等字符。一个很好的近似值可能是使用“Emoji_Presentation”属性,该属性是为所有默认为表情符号呈现而不是文本呈现的字符设置的。
  • 我想这里的主要问题是:你的目标是什么?为什么要从字符串中删除表情符号?
  • 我在这里遇到的第一个问题与您的@SvenMarnach 有关,“您将如何使用any 编程语言来做到这一点?”基于白名单?基于黑名单?查找“表情符号”空间与其他字符的标准?大部分问题与 Rust 无关。
  • 看起来unicode_segmentation crate 可以找到字素簇。那么这只是确定给定字素是否是表情符号的问题

标签: rust emoji


【解决方案1】:

所以我花了一些时间来弄清楚,但这是解决方案

/// Removes all emojis from a string **(retains chinese characters)**
///
/// # Arguments
///
/// * `string` - String with emojis
///
/// # Returns
///
/// * `String` - De-emojified string
///
/// # Examples
///
/// ```
///
/// // Remove all emojis from this string
/// let demojified_string = demoji(String::from("⚡hel✅?lo?"))
/// // Output: `hello`
/// ```
pub fn demoji(string: String) -> String {
    let regex = Regex::new(concat!(
        "[",
        "\u{01F600}-\u{01F64F}", // emoticons
        "\u{01F300}-\u{01F5FF}", // symbols & pictographs
        "\u{01F680}-\u{01F6FF}", // transport & map symbols
        "\u{01F1E0}-\u{01F1FF}", // flags (iOS)
        "\u{002702}-\u{0027B0}",
        "\u{0024C2}-\u{01F251}",
        "]+",
    ))
    .unwrap();

    regex.replace_all(&string, "").to_string()
}

【讨论】:

  • 我认为这里有一个错字,因为 "\u{0024C2}-\u{01F251}" 似乎选择了第三部分中 "带圆圈的拉丁大写字母 m" (Ⓜ) 之间的所有内容BMP 和“Circled Ideograph Accept”(?),涵盖了 BMP 的 3/4 和几乎整个 SMP。
  • 我还建议遵循 Sven Marnach 的提问和建议路线,因为这看起来非常糟糕,而且很容易摔倒。
  • 一个关于编写文档示例的小技巧。而不是"// Output: 'hello'",写assert_eq!(demojified, "hello");,它兼作单元测试!
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2021-03-14
  • 2022-11-28
  • 2018-12-15
  • 2020-06-16
  • 2021-06-13
  • 2016-11-08
相关资源
最近更新 更多