我正在做一个将凯撒密码字符串解码为可读文本的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(', ') => ','
答案 0 :(得分:1)
删除正则表达式末尾的全局标志,您必须一次处理一个字符:
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;
答案 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
然后输出将具有与输入相同的字符数。