【问题标题】:How to detect if text contains [FSI]*[PDI]如何检测文本是否包含 [FSI]*[PDI]
【发布时间】:2021-09-04 07:02:46
【问题描述】:

用于传入通知消息的 Android Studio logcat 显示如下 []message[]

我复制并粘贴到 .txt 文件,它显示 FSImessagePDI

这种字符“FSI”和“PDI”是什么?以及如何检测文本何时包含它们?

【问题讨论】:

  • 这些是用于双向文本的特殊字符类型。你想如何检测它们?如果它们存在于 Java 中的字符串中?
  • @Matt,在whatsapp群聊中,当有人提到你为@时,内容通知会显示[]Matt[]。我想检测何时有人提到我。

标签: java android unicode bidi


【解决方案1】:

这些是用于双向文本的特殊 unicode 字符,是 Explicit Directional Isolate Formatting Characters 组的一部分。它们在您的示例中用于轻松插入方向未知的文本片段。这可以通过将片段包装在 FSI 和 PDI 中来完成。更多信息请咨询Unicode Bidirectional Algorithm

要检测它们,我们需要知道它们的 unicode 表示:

  • 0x2068 (UTF-16) 表示的第一个强隔离 (FSI)。
  • 0x2069 (UTF-16) 表示的流行定向隔离 (PDI)。

现在我们可以使用正则表达式\u2068(.*?)\u2069 来提取包装的内容:

String input = "Hi \u2068Bob\u2069!\nHow is \u2068Alice\u2069?";
System.out.println(input);

Pattern p = Pattern.compile("\u2068(.*?)\u2069");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println(m.group(1));
}

输出:

【讨论】:

  • 您能否更新当检测文本为 FSI/PDI 时返回 true/false 的方法的答案,而不是提取包装的内容。谢谢。
  • @CauCuKien 如果您不需要内容,则可以省略 while 循环。 m.find() 如果找到某物则返回 true,否则返回 false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-04-16
相关资源
最近更新 更多