用表情符号替换字符串的最有效方法[关闭]
Posted
技术标签:
【中文标题】用表情符号替换字符串的最有效方法[关闭]【英文标题】:Most efficient way to replace string with emoji [closed] 【发布时间】:2020-01-19 02:09:15 【问题描述】:替换文本的最有效方法是什么,例如 :) -> ????.
所以,假设我有一个像“你好 :) 我的名字是亚历克斯”这样的文本。 我应该将文本转换为“Hello ???? my name is Alex”
我在 lodash 实用程序库的帮助下解决了这个问题。
const replaceStringWithEmoji = (string) =>
const emojiMap =
':)': '????',
':(': '????',
':D': '????',
';(': '????',
':O': '????',
';)': '????',
'8)': '????',
'>:@': '????',
;
const emojis = [...Object.keys(emojiMap)];
return _.join(_.map(_.split(string, ' '), (s) =>
if (_.includes(emojis, s))
return emojiMap[s];
return s;
), ' ');
;
必须有更好的方法来做到这一点。也许使用正则表达式?
短期回报
return _.join(_.map(_.split(string, ' '), s => _.includes(emojis, s) ? emojiMap[s] : s), ' ');
【问题讨论】:
如果您的代码运行良好并且没有问题,请考虑将问题发布到Code Review。 似乎您需要对大部分数据进行硬设置。不知道你还想让它表现得更好。 :) 这个问题很开放。在您的情况下,“高效”和“更好”是什么意思?如果您的代码是可读的并且适用于所有必需的测试用例,那么不要陷入进行过早优化的陷阱。 【参考方案1】:我将通过获取键、escaping 所有特殊字符并通过|
加入来构建一个模式。然后通过在对象上查找匹配的字符串来替换:
const escape = s => s.replace(/[-\/\\^$*+?.()|[\]]/g, '\\$&');
const replaceStringWithEmoji = (string) =>
const emojiMap =
':)': '?',
':(': '?',
':D': '?',
';(': '?',
':O': '?',
';)': '?',
'8)': '?',
'>:@': '?',
;
const pattern = new RegExp(
Object.keys(emojiMap).map(escape).join('|'),
'g'
);
return string.replace(pattern, match => emojiMap[match]);
;
console.log(replaceStringWithEmoji('foo :) bar'));
console.log(replaceStringWithEmoji('foo :) bar 8) baz'));
【讨论】:
地图逃生,+1【参考方案2】:您无需将 emojiMap 更改为数组,您可以使用交替构建正则表达式并使用 repalce
const replaceStringWithEmoji = (string) =>
const emojiMap =
':)': '?',
':(': '?',
':D': '?',
';(': '?',
':O': '?',
';)': '?',
'8)': '?',
'>:@': '?',
;
let regex = /(?::\)|:\(|:D|;\(|:O'|;\)|8\)|>:@)/g
return string.replace(regex,(m)=>emojiMap[m] || m)
;
console.log(replaceStringWithEmoji("Hello :) my name is Alex"))
【讨论】:
string.replace() 通常是 O(n) 吗?顺便说一句 @ChristopherNgo 据我所知这取决于你的正则表达式,因为这个正则表达式不包含任何回溯,所以它应该是O( m + n )
其中 m 是输入长度,n 是交替次数
甜蜜!很高兴知道:)以上是关于用表情符号替换字符串的最有效方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章