使用\ B实现RegExp,表示不匹配包含字母的表情符号的表情符号

时间:2016-06-18 20:57:17

标签: javascript regex emoticons

我正在为游戏项目开发一个聊天客户端,我正在实现表情符号。表情符号应该在聊天中显示的基本规则是,当它们直接位于文本旁边时,它们不会出现。

我创建了正则表达式:\ B(表情文本)\ B。

不幸的是,我遇到了一个问题,即除了包含字母的表情符号外,每个表情符号的效果都非常好。 (例如:D,O_o等)

我不确定如何纠正这种情况。

// apply the Google Services Plugin
apply plugin: "com.google.gms.google-services"

这是表情符号数组的一部分,用于上下文。

app/google-services.json

1 个答案:

答案 0 :(得分:1)

  

当它们直接位于文本旁边时不会出现

这听起来更像是要检查周围的空白,而不是\B(“非单词边界”)。

那是:

var pattern = new RegExp('(^|\\s)' + emoticon.string.replace(/\W/g, '\\$&') + '(?!\\S)', 'g');
text = text.replace(pattern, function (m0, m1) { return m1 + emoticon.img; });

注意事项:

  • (^|\s)检查(并捕获)字符串或空白字符的开头
  • .replace(/\W/g, '\\$&')转义表情符号中所有潜在的正则表达式元字符(这意味着您可能需要在表情符号列表中将':\\)'更改为':)'
  • (?!\S)(“后面没有非空格字符”)确保表情符号后跟空格或字符串结尾(我们不能在开头使用相同的技巧,因为JavaScript没有“支持后视”
  • 因为我们可能在开头捕获了一个空格字符,所以我们必须将它替换为HTML代码
  • 我们可以使用.replace(pattern, '$1' + emoticon.img)执行此操作,但如果emoticon.img最终包含$理解和解释的特殊.replace模式之一,则会导致问题
  • 而是我们使用替换函数,它将整个匹配的字符串和捕获组(以及其他一些东西)作为参数(但我们只关心第一个捕获组)