【问题标题】:How to remove all but emojis in a (Javascript) string?如何删除(Javascript)字符串中除表情符号之外的所有内容?
【发布时间】:2015-08-14 08:09:01
【问题描述】:

我正在尝试多个正则表达式,但我无法让它们工作。

我有一个简单的输入,用户可以输入他们喜欢的任何内容,只是最终结果必须包含表情符号。为此,我必须从字符串中删除不是表情符号的每个字符,然后检查长度是否 >= 1。

所以基本上这个:asf..?23kj????gasdf..????,fwe34 应该变成这个:????????。然后我会检查长度以确认它 >=1 并且我会很高兴。

我正在使用 Mac OS 自己的虚拟表情符号键盘来沿着输入中的文本编写表情符号,以防你觉得知道它有用。

【问题讨论】:

  • 将您已经尝试过的代码添加到您的问题中。
  • "I'm trying multiple regex expressions" - 没有发布过? javascript 字符串中的表情符号是什么样的?
  • 它显示的只是一个图标,尽管它在内部附加了一个 unicode (apps.timwhitlock.info/emoji/tables/unicode)。
  • 我只是使用“替换”功能来删除字符,例如tags.replace(/^[\u1f600-\u1f64f]/g, 'X');,而不是删除字符应该将它们更改为“X”。
  • .replace(/\ud83d[\ude00-\ude4f]/g, '') 删除所有表情符号,然后计数s.length - s_new.length 怎么样?

标签: javascript regex emoji


【解决方案1】:

根据我从 cmets 得到的信息,其中一些可能有帮助,也可能没有帮助 -



验证字符串是否包含 1 个或多个表情符号:

 # ^(?=[\S\s]*(?:\ud83d[\ude00-\ude4f]))

 ^ 
 (?=
      [\S\s]* 
      (?: \ud83d [\ude00-\ude4f] )
 )


只删除表情符号,留下其余的(全局):

查找:(?:\ud83d[\ude00-\ude4f])*((?:(?!\ud83d[\ude00-\ude4f])[\S\s])+)(?:\ud83d[\ude00-\ude4f])*
替换:$1

 (?: \ud83d [\ude00-\ude4f] )*
 (                                       # (1 start)
      (?:
           (?! \ud83d [\ude00-\ude4f] )
           [\S\s] 
      )+
 )                                       # (1 end)
 (?: \ud83d [\ude00-\ude4f] )*


删除除表情符号以外的所有内容(全局):

查找:((?:\ud83d[\ude00-\ude4f])*)(?:(?!\ud83d[\ude00-\ude4f])[\S\s])+((?:\ud83d[\ude00-\ude4f])*)
替换:$1$2

 (                                       # (1 start)
      (?: \ud83d [\ude00-\ude4f] )*
 )                                       # (1 end)
 (?:
      (?! \ud83d [\ude00-\ude4f] )
      [\S\s] 
 )+
 (                                       # (2 start)
      (?: \ud83d [\ude00-\ude4f] )*
 )                                       # (2 end)

编辑:要使用不同的 emoji utf16 范围,请执行此操作

不同的高代理:

(?:
     High_surrogate_A [Low_surrogate_start_A-Low_surrogate_end_A]
  |  High_surrogate_B [Low_surrogate_start_B-Low_surrogate_end_B]
  |  High_surrogate_C [Low_surrogate_start_C-Low_surrogate_end_C]
)

或者,相同的高代理,不同的低代理范围:

(?:
     High_surrogate [Low_surrogate_start1-Low_surrogate_end1Low_surrogate_start2-Low_surrogate_end2]
)

或者,混合:

(?:
     High_surrogate_A [Low_surrogate_startA1-Low_surrogate_endA1Low_surrogate_startA2-Low_surrogate_endA2]
  |  High_surrogate_B [Low_surrogate_start_B-Low_surrogate_end_B]
)

你在哪里看到:

(?: \ud83d [\ude00-\ude4f] )*

在占位符HERE 中替换上述之一

HERE*

你在哪里看到:

(?! \ud83d [\ude00-\ude4f] )

在占位符HERE 中替换上述之一

(?!HERE)


注意 - 您也可以添加高代理范围,但是所有高代理必须共享相同的低代理范围。

【讨论】:

  • 这几乎可以正常工作,但这主要是由于在其他 UTF 范围中添加了新的表情符号,因此它们在不应该被删除时被删除。这段代码基本上可以正常工作,但正如我所说,它删除的内容超出了应有的范围。如何添加更多范围,以免删除新的表情符号?顺便说一句,如果你能告诉我,你是在哪里找到这些范围的。
【解决方案2】:

表情符号位于 1F601 - 1F64F 的补充平面中。普通的 JS 正则表达式不适用于此类代码点。如果你有一个支持新的u 标志(Babel 支持)的 ES6 实现,那应该可以为你完成这项工作。

tags.replace(/^[\u{1f600}-\u{1f64f}]/g, 'X');

否则需要考虑使用https://github.com/mathiasbynens/regenerate之类的库。

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 2012-12-10
    • 2021-03-05
    • 2011-11-08
    • 2017-03-26
    • 2013-08-08
    • 2014-03-21
    • 2014-03-26
    相关资源
    最近更新 更多