正则表达式:查找带有冒号和肤色的表情符号名称

3
我正在使用 EmojiMart作为我的解析器。
我看到了这个相关问题,但它似乎与我的问题不同。
因此,我需要返回表情符号的名称或:编码:以便能够解码它们。
例如,我有这段文字:
:+1::skin-tone-6::man-pouting:Hello world:skin-tone- 
6:lalalalla:person_with_pouting_face: :poop::skin-tone-11: mamamia 
:smile: :skin-tone-6:

我会尽力帮助您翻译。以下是需要翻译的内容:

它应该匹配整个:+1::skin-tone-6:而不是单独的:+1::skin-tone-6::——只有它们之间没有空格时才能匹配。(注意:smile::skin-tone-6:之间的空格)

条件:

只有在skintone为2-6时才应匹配:code::skintone:

如果我执行str.split(regex),这是我的预期结果(数组):

- :+1::skin-tone-6:
- :man-pouting:
- Hello world
- :skin-tone-6:
- lalalalla
- :person_with_pouting_face: 
- :poop:
- :skin-tone-11: 
-  mamamia 
- :smile: 
- :skin-tone-6:
1个回答

1
您可以使用 String#split() 方法与

一起。
/(:[^\s:]+(?:::skin-tone-[2-6])?:)/

正则表达式。查看正则表达式演示

详情

  • : - 冒号
  • [^\s:]+ - 除空格和冒号外的至少1个字符
  • (?:::skin-tone-[2-6])? - 可选序列:
    • ::skin-tone- - 字面字符串
    • [2-6] - 数字2到6中的一个
  • : - 冒号

JS演示:

var s = ":+1::skin-tone-6::man-pouting:Hello world:skin-tone-6:lalalalla:person_with_pouting_face: :poop::skin-tone-11: mamamia :smile: :skin-tone-6:";
var reg = /(:[^\s:]+(?:::skin-tone-[2-6])?:)/;
console.log(s.split(reg).filter(x => x.trim().length !=0 ));

.filter(x => x.trim().length !=0 )会从结果数组中删除所有空白项。对于ES5及更早版本,请使用.filter(function(x) { return x.trim().length != 0; })


谢谢您,先生。我想知道是否也可以在 str.replace(regex, callback) 上实现它。目前我正在使用 str.split(regex).filter(Boolean).map(emoji => myfunction).join('') 来模拟 replace 的功能。但我认为 replace 更快。 - I am L
是的,但是replace只会替换带有:+1::skin-tone-6:的那个。它不会“匹配”其他没有肤色的:code:。我猜我得使用split? - I am L
@IamL 真的很抱歉,我不明白。请参见 http://jsfiddle.net/ew8akcnd/4/。这是你想要的吗? - Wiktor Stribiżew
不用担心,你已经做得足够好了。但是,是的,应该将“:poop:”替换为“000”,而不仅仅是替换“:+1::skin-tone-6:”。 - I am L
2
@IamL :) 忘记了全局修饰符,更新的代码片段。当您在 split() 方法中使用正则表达式时,默认行为是查找所有匹配项进行分割。在 .replace 中,应该明确定义。 - Wiktor Stribiżew
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接