我有以下函数,它用给定的表情符号字符替换字符串代码。
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/