为什么我们在这个表达式str.replace中使用_(/ [\ _W _] / g,'')。toLowerCase();我们本可以使用/ [\ W] / g,但为什么我们使用下划线?

时间:2015-10-30 13:10:44

标签: javascript algorithm

这是一个javascript问题。我在freecodecamp上解决了回答问题。让我在这里写完整代码:

 function palindrome(str) {
 var normalizedStr = str.replace(/[\W_]/g, '').toLowerCase();
 var reverseStr = normalizedStr.split('').reverse().join('');
  return normalizedStr === reverseStr;
 }

2 个答案:

答案 0 :(得分:7)

\ W 元字符用于查找非单词字符。单词字符是来自a-z,A-Z,0-9,的字符,包括下划线字符。这意味着如果您使用[\ W]而不是[\ W _]

var normalizedStr = str.replace(/[\W]/g, '').toLowerCase();

您的normalizedStr在替换后仍然包含下划线

由于此挑战需要删除所有非字母数字字符(标点符号,空格和符号),因此对于包含“_”的任何已处理字符串,它将返回不需要的结果:

  

回文(“_ eye”) - 应该返回true,但它将是假的;

     

回文(“0_0(:/ - \ :) 0-0”) - 应该返回true,但将为false;

此外,不是将字符串转换为数组,而是将其反转并在比较之前将其转换回字符串,更好地使用 for循环来比较数组以获得更好的性能(特别是如果字符串是更大的):

function palindrome(str) {
  var clearString = str.toLowerCase().replace(/[^0-9a-z]/gi, '').split('');

  for (var i = 0; i < clearString.length/2; i++) {
    if (clearString[i] !== clearString[clearString.length -1 -i]) {  
      return false;
    } 
  }
  return true;
}

请注意, false 语句应首先 true 语句必须> for for循环,否则它将在第一次匹配后中断函数并返回不准确的结果。

基准代码段在这里:

const stringLength = 100000;  // < < ADJUST THE STRING LENGTH HERE

const string = superString(stringLength);

console.log(`Random string length: ${string.length} symbols`);

benchMark(arraySplitReverseJoinMethod);
benchMark(forLoopComparisonMethod);

function arraySplitReverseJoinMethod(str) {
  return str == str.split('').reverse().join('');
}

function forLoopComparisonMethod(str) {
  let string = str.split('');
  
  for (var i = 0; i < string.length/2; i++) {
    if (string[i] !== string[string.length -1 -i]) {  
      return false;
    } 
  }

  return true;
}

function benchMark(func) {
  const start = +new Date();

  func(string);

  const end = +new Date();
  const total = end - start;

  console.log(`${func.name}: ${total} ms`);

  return `${func.name}: ${total} ms`;
}

function superString(n) {
  let superString = '';

  for (let i = 0; i < n; i++) {
    const randomString = Math.random().toString(36).substring(2, 12);

    superString = superString.concat(randomString);
  }

  return superString;
}

答案 1 :(得分:2)

\W匹配任何非单词字符[^a-zA-Z0-9_]

_文字_

所以这个正则表达式只会在你的字符串中保留字母和数字