【问题标题】:how can i remove special emoji's using xquery from text如何从文本中删除使用 xquery 的特殊表情符号
【发布时间】:2022-01-01 18:19:43
【问题描述】:

我有一个 $text = "你好 ???????????? ?????? ???????? ????üäö$"

我想使用 xquery 从文本中删除表情符号。我该怎么做?

预期结果:“Hello üäö$”

我尝试使用:

replace($text, '\p{IsEmoticons}+', '')

但没用。

它只是删除了笑脸

现在的结果:“你好 ???? ???????? ????üäö$” 预期结果:“Hello üäö$”

提前致谢:)

【问题讨论】:

  • 我也使用了 replace($test,"\p{So}+", '') 但它仍然没有删除所有符号结果:“Hello ???????? ?? ??üäö$" link
  • 有趣,似乎字符 ` ????, ????????, and ????are not part of the \p{IsEmoticons}` 类,至少在xqueryfiddle.liberty-development.net/94hwpi9 使用的Unicode Saxon 10.6 版本中没有。
  • 您将需要列举这些字符所属的各种类别,例如'[\p{IsEmoticons}\p{So}]' 作为 replace 的第二个参数,带有 remove `???????????? ??????`,将需要检查或检查其他角色属于哪个类别或类别。

标签: xquery xquery-3.0


【解决方案1】:

我在my answer to the original question 中概述了该方法,我根据您询问如何删除?的评论更新了该方法。

引用该扩展答案:

“表情符号”块不包含通常与“表情符号”相关的所有字符。例如,?(紫心,U+1F49C),根据https://www.compart.com/en/unicode/U+1F49C 之类的网站可以让您查找 Unicode 字符信息,来自:

其他符号和象形文字,U+1F300 - U+1F5FF

此块在 XPath 或 XQuery 处理器中不可用,因为它既没有列在上面链接的 XML Schema 1.0 规范中,也没有列在 Unicode block names for use in XSD regular expressions 中——XPath 和 XQuery 处理器符合 XML Schema 1.1 的块列表是required to support

对于 XPath 或 XQuery 中不可用的块中的字符,您可以手动构造字符类。例如,给定上面的紫心字符,我们可以这样匹配:

replace("Purple ? heart", "[🌀-🗿]", "")

这会返回预期的结果:

Purple  Heart

这种方法可以应用于??、?或任何其他角色:

  1. 找到角色的 unicode 块。
  2. 使用块名称(如果在 XPath 中可用)或字符类来创建您的正则表达式。

或者,您可以识别要保留的字符块,而不是定位要删除的字符块。例如,给定原始帖子中的示例字符串,目标可能是仅保留“基本拉丁语”块中的那些字符。为此,我们可以通过\P Category Escape 匹配不在此块中的字符:

xquery version "3.1";

let $text := "Hello ??? ? ?? ?üäö$"
return
    replace($text, "\P{IsBasicLatin}", "")

此查询返回:

Hello    $

请注意,这已经去掉了带有变音符号的字符,这可能是不希望的。这些带有变音符号的字符属于 Latin-1 Supplement 块。要同时保留 Latin 和 Latin-1 Supplement 块中的字符,我们需要按如下方式调整查询:

xquery version "3.1";

let $text := "Hello ??? ? ?? ?üäö$"
return
    replace($text, "[^\p{IsBasicLatin}\p{IsLatin-1Supplement}]", "")

...返回:

Hello    üäö$

现在这会保留带有变音符号的字符。

要准确了解您保留或删除的字符,您需要查阅 Unicode 块和图表。

【讨论】:

  • 谢谢你的回答,但如果我有很多这样的字符,他们有什么通用的方法可以一次消除所有字符吗?
  • 我用更通用的方法扩展了我的答案。如果您发现我对这个问题的回答和/或您之前的问题是正确的,请将其标记为答案,以便其他用户知道它对您有用。
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2017-10-09
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多