javascript - 将字符串转换为表情符号

标签 javascript regex replace emoji

我有以下函数,它用给定的表情符号字符替换字符串代码。

export const CHARS = {
  ":)": "🙂",
  "(:": "🙂",
  ":-)": "🙂",
  ":(": "😞",
  "):": "😞",
  ":-(": "😞",
  ":/": "😕",
}

convertEmoji = string => {
    const escape = s => s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")
    const pattern = new RegExp(
      Object.keys(CHARS).map(escape).join("|"),
      "g"
    )
    return string.replace(pattern, match => CHARS[match])
}

这按预期工作,但它也会在任何给定的 CHARS[key] 出现在单词中时进行转换。

例如,将此函数传递给包含 URL 的字符串:

https://google.com

变成:

https😕/google.com

我希望仅当表情符号代码在给定句子中显示为单词时,替换功能才起作用。例如:

:) Hello world! - 这里的函数应该可以工作。

:)Hello world! - 这里应该不起作用,因为表情符号代码没有正确的空格。

请帮我解决这个问题。

最佳答案

您需要为您的模式指定左侧和右侧上下文。

如果你想确保左边和右边没有紧邻的单词字符,你需要用 (?<!\w) 表示的明确的单词边界。和 (?!\w)环视:

new RegExp('(?<!\\w)(?:' + Object.keys(CHARS).map(escape).join("|") + ')(?!\\w)', "g")

或者,您可以依赖空白边界,这需要空白字符或两端的字符串开始/结束:

new RegExp('(?<!\\S)(?:' + Object.keys(CHARS).map(escape).join("|") + ')(?!\\S)', "g") 

如果您需要进一步精确的边界模式,请根据您的要求选择解决方案并精确查看环视中的模式。

关于javascript - 将字符串转换为表情符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68565962/

相关文章:

javascript - 将UTC时间戳从数据库转换为登录日期时间的用户

android - Kotlin正则表达式不适用于我在运行时得到的波兰char (“ł”)

java - 忽略 token 正则表达式中的字符串

command-line - 如何在特定标记后搜索和替换空行?

javascript - arr.reduce 显示最短长度而不是最长长度

javascript - JavaScript 中带变量的倒计时

xslt - XSL 用插入符替换空格

jquery - 使用 jquery 将列表项的一部分替换为来自表单的输入

javascript - 如何命名特定于将其封装在 ASP.NET MVC 中的 div id 的 Javascript 函数

Python re 与上一个捕获组不匹配