用字母表中的位置替换字母 \- 正则表达式

新手上路,请多包涵

这个挑战的描述是获取一个字符串并将字母替换为字母表中从 1-index 开始的字母位置。要求您跳过所有非字符,包括空格。

 function alphabetPosition(text) {
  var result = [];
  var alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
    "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
    "w", "x", "y", "z"]
  text = text.replace(/\W*\d+/g, '').toLowerCase().split('');
  for (var i = 0; i < text.length; i++)
    result.push(alphabet.indexOf(text[i]) + 1);
  return result.join(' ');
}

我的问题是,当涉及到随机测试时,输入将包含数字和非单词字符,但 Regex 无法识别它。输入是 n8_ovuu& 输出/错误是 Expected: '14 15 22 21 21', instead got: '14 0 15 22 21 21 0'

问题出在正则表达式上,但我无法弄清楚。如果您有任何想法,我将不胜感激!

原文由 Jon Langel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 363
2 个回答

在循环中添加一个条件:

代替:

 for (var i = 0; i < text.length; i++)
  result.push(alphabet.indexOf(text[i]) + 1);

和:

 for (var i = 0; i < text.length; i++) {
  var j = alphabet.indexOf(text[i]) + 1;
  if (j) result.push(j);
}

请注意,您可以将字母表定义为字符串而不是数组,而无需对上述循环进行任何更改:

 var alphabet = 'abcdefghijklmnopqrstuvwxyz';

函数式编程解决方案 - 没有 RegEx

这是一个 ES6 代码解决方案,它将方法一个接一个地链接起来,以在一个 return 语句中返回结果:

 function alphabetPosition(text) {
  return text.toLowerCase().split('')
        .filter( c => c >= 'a' & c <= 'z' )
        .map( c => c.charCodeAt(0) - 'a'.charCodeAt(0) + 1)
        .join(' ');
}

console.log(alphabetPosition('n8_ovuu&'));

函数式编程解决方案 - 使用 RegEx

 function alphabetPosition(text) {
  return text.toLowerCase().replace(/[^a-z]/g, '')
        .replace(/./g, ([c]) => ' ' + (c.charCodeAt(0) - 'a'.charCodeAt(0) + 1))
        .substr(1);
}

console.log(alphabetPosition('n8_ovuu&'));

原文由 trincot 发布,翻译遵循 CC BY-SA 3.0 许可协议

这有效并且非常简洁:

 const data = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"£$%^&*()';

const result = data.toLowerCase().match(/[a-z]/g).map(c => c.charCodeAt(0) - 96).join(' ');

console.log(result);

原文由 c24w 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题