【问题标题】:How to detect emojis in a String in Flutter using Dart?如何使用 Dart 在 Flutter 中检测字符串中的表情符号?
【发布时间】:2019-08-21 07:47:31
【问题描述】:

我想取一个字符串值,并找出其中是否有任何表情符号。可能是一些正则表达式魔法,但不知道如何做到这一点。

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    正在寻找同样的东西。

    找到这个新发布的包: https://pub.dartlang.org/packages/flutter_emoji

    MIT 许可证。

    查看源代码似乎是使用的正则表达式:

    /// A tweak regexp to pass all Emoji Unicode 11.0
    /// TODO: improve this version, since it does not match the graphical bytes.
    static final RegExp REGEX_EMOJI = RegExp(r'(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])');
    

    我希望这些信息对您有所帮助。

    【讨论】:

    • 它不起作用,因为它会包含一些汉字,例如“。”(中文中的“.”很常见)
    • 我不知道为什么,但我必须将变量名称更改为驼峰式大小写才能使其工作:'regexEmoji' 而不是 'REGEX_EMOJI'。
    • 通过省略正则表达式的一部分:'[\u2000-\u3300]',我能够跳过“。”字符以及其他日文字符。所以完整修改的正则表达式是: final RegExp regexEmoji = RegExp(r'(\u00a9|\u00ae|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff ])');这是一个 unicode 汉字表:rikai.com/library/kanjitables/kanji_codes.unicode.shtml
    【解决方案2】:

    使用它来避免输入中的所有类型的特殊字符和表情符号-

    inputFormatters: [WhitelistingTextInputFormatter(RegExp(r'[a-zA-Z0-9]'))],
    

    【讨论】:

    • inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'[a-zA-Z]'))],
    • 文本输入是电子邮件字段时怎么办?应该允许哪些字符?
    【解决方案3】:

    由于@ninnepinne的回答不起作用,因为它会包含一些汉字,例如“。”(中文中的“.”很常见),我必须另寻解决方案。

    经过一番研究,我发现this answer 对 javascript 很有帮助。

    在 dart 中,我们可以使用以下内容:

    var regex = RegExp(
          r'(?:[\u00A9\u00AE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9-\u21AA\u231A-\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA-\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614-\u2615\u2618\u261D\u2620\u2622-\u2623\u2626\u262A\u262E-\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665-\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B-\u269C\u26A0-\u26A1\u26AA-\u26AB\u26B0-\u26B1\u26BD-\u26BE\u26C4-\u26C5\u26C8\u26CE-\u26CF\u26D1\u26D3-\u26D4\u26E9-\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733-\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763-\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934-\u2935\u2B05-\u2B07\u2B1B-\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|(?:\uD83C[\uDC04\uDCCF\uDD70-\uDD71\uDD7E-\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01-\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50-\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96-\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F-\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95-\uDD96\uDDA4-\uDDA5\uDDA8\uDDB1-\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB-\uDEEC\uDEF0\uDEF3-\uDEF6]|\uD83E[\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]))');
    

    【讨论】:

      【解决方案4】:

      我将flutter_emoji 分叉为dart_emoji,它有一个方法:

      // Check if text contains only emojis
      EmojiUtil.hasTextOnlyEmoji("?"); // returns true
      EmojiUtil.hasTextOnlyEmoji("? Hello"); // returns false
      
        flutter-emoji dart-emoji
      Still maintained?
      Null Safety
      Pure Dart Package
      Updated emojis

      https://pub.dev/packages/dart_emoji

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-06
        • 2022-12-19
        • 2021-02-23
        相关资源
        最近更新 更多