用表情符号替换字符串的最有效方法[关闭]

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 是交替次数 甜蜜!很高兴知道:)

以上是关于用表情符号替换字符串的最有效方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

替换给定 unicode 字符串中的所有表情符号

用net匹配并替换iOS标准的emoji表情符号

如何在golang中使用正则表达式替换字符串中的表情符号

用英语等价物替换德语字符(变音符号、重音符号)

数据库mysql 如何保存表情符号 然后返回到前端

使用“BeanUtils alike”替换的最简单方法