Javascript 地图和正则表达式的奇异性
我正在做一个kata,它把凯撒密码串解码成可读的文本。我在地图中使用正则表达式来查找特殊字符并跳过它们,但是如果有两个或更多的特殊字符相邻,则输出是不稳定的','或':)'。它似乎跳过了一些特殊的字符 有人能解释发生了什么事吗 我没有包括changeCharCode函数代码,因为我认为问题在我的映射中Javascript 地图和正则表达式的奇异性,javascript,regex,Javascript,Regex,我正在做一个kata,它把凯撒密码串解码成可读的文本。我在地图中使用正则表达式来查找特殊字符并跳过它们,但是如果有两个或更多的特殊字符相邻,则输出是不稳定的','或':)'。它似乎跳过了一些特殊的字符 有人能解释发生了什么事吗 我没有包括changeCharCode函数代码,因为我认为问题在我的映射中 function decodeString(string) { const stringArr = string.toLowerCase().split(''); const specia
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(', ') => ','
函数解码字符串(字符串){
const stringArr=string.toLowerCase().split(“”);
常量specialCharacters=/[,\/\\!$%\^&\*;:{}=\-\u`~()]/g;
常量codeOfX='x'。字符编码(0);
常量codeOfLastLetter=stringArr[stringArr.length-1].charCodeAt(0);
const codeShift=codeOfX-codeOfLastLetter;
返回stringArr.map((elem)=>{
//特殊字符处理
返回特殊字符。test(elem)==true?elem:changecharCode(elem,codeShift);
}).join(“”).toUpperCase();
}
函数更改字符代码(字母、代码移位){
const currentCode=字母.charCodeAt(0);
//大写字母
如果((当前代码>=65)&&(当前代码=97)&&(当前代码')'
decodeString(',')=>','
问题与相同。假设出现问题是因为保持全局匹配状态的g
标志。在您的情况下,解决方案应该是删除一个g
标志,一旦您的函数一个接一个地处理字符,那么g
标志就没有必要了。问题在您的undefined
。稍后执行的join
将为每个undefined
值生成一个空字符串,因此在输出中看不到任何内容
如果要在changecharCode
中添加一个final:
return ' '; // or whatever character you want here
然后,输出将具有与输入相同的字符数。删除正则表达式末尾的全局标志,您必须一次处理一个字符:
函数解码字符串(字符串){
const stringArr=string.toLowerCase().split(“”);
常量specialCharacters=/[,\/\\!$%\^&\*;:{}=\-\u`~()]/;
//这里___^
常量codeOfX='x'。字符编码(0);
常量codeOfLastLetter=stringArr[stringArr.length-1].charCodeAt(0);
const codeShift=codeOfX-codeOfLastLetter;
返回stringArr.map((elem)=>{
//特殊字符处理
返回特殊字符。test(elem)==true?elem:changecharCode(elem,codeShift);
}).join(“”).toUpperCase();
}
函数更改字符代码(字母、代码移位){
const currentCode=字母.charCodeAt(0);
//大写字母
如果((currentCode>=65)&&&(currentCode=97)&(currentCodespecialCharacters.test
对您在两个调用中提供的每个字符都是真的,您可以很容易地通过调试进行验证。“跳过”是什么意思?如果没有changecharCode
函数,我们无法测试输出。您能提供它吗?为您添加了changecharCode的代码。通过“跳过”,我希望映射返回元素(如果它是特殊字符),那么当您加入映射数组时,特殊字符位于相同的位置。我也不想处理特殊字符changecharCode函数中的所有字符。是的,你是对的,每个输出的测试调用都返回true,但正如你从输出中看到的,映射的结果并不包括所有特殊字符的元素。因此,事实证明,你的错误在该函数中。请看我的答案。我看到你刚刚删除了一个标记了bash
。您介意重新打开吗,因为我已经为此编写了一个解决方案。?