Javascript 地图和正则表达式的奇异性

Javascript 地图和正则表达式的奇异性,javascript,regex,Javascript,Regex,我正在做一个kata,它把凯撒密码串解码成可读的文本。我在地图中使用正则表达式来查找特殊字符并跳过它们,但是如果有两个或更多的特殊字符相邻,则输出是不稳定的','或':)'。它似乎跳过了一些特殊的字符 有人能解释发生了什么事吗 我没有包括changeCharCode函数代码,因为我认为问题在我的映射中 function decodeString(string) { const stringArr = string.toLowerCase().split(''); const specia

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

有人能解释发生了什么事吗

我没有包括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(', ') => ','
函数解码字符串(字符串){
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
标志就没有必要了。

问题在您的中ode>changecharCode函数:如果字符代码不在测试的两个范围内,则该函数不返回任何内容,即
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)&(currentCode
specialCharacters.test
对您在两个调用中提供的每个字符都是真的,您可以很容易地通过调试进行验证。“跳过”是什么意思?如果没有
changecharCode
函数,我们无法测试输出。您能提供它吗?为您添加了changecharCode的代码。通过“跳过”,我希望映射返回元素(如果它是特殊字符),那么当您加入映射数组时,特殊字符位于相同的位置。我也不想处理特殊字符changecharCode函数中的所有字符。是的,你是对的,每个输出的测试调用都返回true,但正如你从输出中看到的,映射的结果并不包括所有特殊字符的元素。因此,事实证明,你的错误在该函数中。请看我的答案。我看到你刚刚删除了一个标记了
bash
。您介意重新打开吗,因为我已经为此编写了一个解决方案。?