地图和RegEx怪异

时间:2017-08-26 10:01:13

标签: javascript regex

我正在做一个将凯撒密码字符串解码为可读文本的kata。我在地图中使用RegEx来查找特殊字符并跳过它们,但如果我有两个或更多特殊字符彼此相邻,则输出是不稳定的,','或者' :)'。它似乎跳过一些特殊字符。

有谁可以解释发生了什么?

我还没有包含changeCharCode功能代码,因为我认为问题出在我的地图上。

function decodeString(string) {
  const stringArr = string.toLowerCase().split('');
  const specialCharacters = /[ .,\/#!$%\^&\*;:{}=\-_`~()]/g;
  const codeOfX = 'x'.charCodeAt(0);
  const codeOfLastLetter = stringArr[stringArr.length - 1].charCodeAt(0);
  const codeShift = codeOfX - codeOfLastLetter;

  return stringArr.map((elem) => {
    // Special character treatment
    return specialCharacters.test(elem) === true ? elem : changecharCode(elem, codeShift);
}).join('').toUpperCase();
  }

function changecharCode (letter, codeShift) {
  const currentCode = letter.charCodeAt(0);
  // Uppercase letters
  if ((currentCode >= 65) && (currentCode <= 90))
    return letter = String.fromCharCode(((currentCode - 65 + codeShift) % 26) + 65);
  // Lowercase letters
  else if ((currentCode >= 97) && (currentCode <= 122))
    return letter = String.fromCharCode(((currentCode - 97 + codeShift) % 26) + 97);
}

decodeString(' :) ') => ' ) '
decodeString(', ') => ','

3 个答案:

答案 0 :(得分:1)

删除正则表达式末尾的全局标志,您必须一次处理一个字符:

&#13;
&#13;
function decodeString(string) {
  const stringArr = string.toLowerCase().split('');
  const specialCharacters = /[ .,\/#!$%\^&\*;:{}=\-_`~()]/;
  //                                              here ___^
  const codeOfX = 'x'.charCodeAt(0);
  const codeOfLastLetter = stringArr[stringArr.length - 1].charCodeAt(0);
  const codeShift = codeOfX - codeOfLastLetter;

  return stringArr.map((elem) => {
    // Special character treatment
    return specialCharacters.test(elem) === true ? elem : changecharCode(elem, codeShift);
}).join('').toUpperCase();
  }

function changecharCode (letter, codeShift) {
  const currentCode = letter.charCodeAt(0);
  // Uppercase letters
  if ((currentCode >= 65) && (currentCode <= 90))
    return letter = String.fromCharCode(((currentCode - 65 + codeShift) % 26) + 65);
  // Lowercase letters
  else if ((currentCode >= 97) && (currentCode <= 122))
    return letter = String.fromCharCode(((currentCode - 97 + codeShift) % 26) + 97);
}

console.log('>'+decodeString(' :) ')+'<');
console.log('>'+decodeString(', ')+'<');
&#13;
&#13;
&#13;

答案 1 :(得分:0)

why-does-my-javascript-regex-test-give-alternating-results的问题相同。让我们说问题是由g标志引起的,它保持全局匹配状态。您的情况下的解决方案应该是删除g标志,一旦您的函数逐个进行字符处理,则g标志是不必要的。

答案 2 :(得分:0)

问题出在changecharCode函数中:如果字符代码不在测试的两个范围内,则函数不返回任何内容,即undefined。您稍后执行的join将为每个undefined值生成一个空字符串,因此您在输出中看不到任何内容。

如果您要将结果添加到changecharCode

return ' '; // or whatever character you want here

然后输出将具有与输入相同的字符数。