我已经创建(或尝试创建)一个JS函数,该函数忽略特殊字符反转字符串。连续2个特殊字符时,功能不起作用。
我提供了以下所有重现问题所需的代码。包括一些可以使用mocha
运行的测试。 第二项测试失败。
以下代码通过测试:
const assert = require('assert');
const reverseButNoSpecial = (str) => {
const specialChars = /[^a-zA-Z ]/g;
// create an array withOUT special chars
const cleanArray = str.replace(specialChars, "").split('');
// iterate over the original
// replace each letter with a letter from the clean array,
// leave the special chars
return str.split('').map(char => {
if (specialChars.test(char)) {
return char;
}
// remove the last char from the reversed array
const removed = cleanArray.pop();
// return the char that was removed
return removed;
}).join('');
}
describe('Reverse all characters except special chars', () => {
it ('should work for a,b$c!', () => {
expected = 'c,b$a!';
actual = reverseButNoSpecial('a,b$c!');
assert.strictEqual(expected, actual);
})
it ('should work for Ab,c,d$$e!', () => {
expected = 'ed,c,b$$A!';
actual = reverseButNoSpecial('Ab,c,d$$e!');
assert.strictEqual(expected, actual);
})
})
预期reverseButNoSpecial('Ab,c,d$$e!')
返回ed,c,b$$A!
但得到ed,c,b$A!
(请注意,$
仅应出现两次,$$
有人可以帮我找出原因吗?
答案 0 :(得分:2)
重新使用全局搜索的正则表达式对象时会出现“陷阱”。正则表达式对象保持状态,特别是lastIndex属性保持不变。
这是一个很好的解释: https://siderite.blogspot.com/2011/11/careful-when-reusing-javascript-regexp.html
要解决此问题,请不要使用“ specialChars”对象,而只需使用正则表达式对象raw,如下所示:
(/ [^ a-zA-Z] / g).test(char)