Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在这个表达式str.replace(/[\W\u]/g,';';&)中使用uu;我们也可以使用/[\W]/g,但为什么要使用下划线?_Javascript_Algorithm - Fatal编程技术网

Javascript 为什么在这个表达式str.replace(/[\W\u]/g,';';&)中使用uu;我们也可以使用/[\W]/g,但为什么要使用下划线?

Javascript 为什么在这个表达式str.replace(/[\W\u]/g,';';&)中使用uu;我们也可以使用/[\W]/g,但为什么要使用下划线?,javascript,algorithm,Javascript,Algorithm,这是一个javascript问题。我在freecodecamp上解决回文问题。让我在这里编写完整的代码: function palindrome(str) { var normalizedStr = str.replace(/[\W_]/g, '').toLowerCase(); var reverseStr = normalizedStr.split('').reverse().join(''); return normalizedStr === reverseStr; } \W

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

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

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

\uu
文字字符
\u


因此,这个正则表达式将只在字符串中保留字母和数字,\W元字符用于查找非单词字符。单词字符是来自A-z、A-z、0-9、的字符,包括下划线。这意味着如果您使用[\W]而不是[\W\u]

var normalizedStr = str.replace(/[\W]/g, '').toLowerCase();
替换后,normalizedStr仍将包含下划线

由于此挑战要求删除所有非字母数字字符(标点符号、空格和符号),因此它将为任何处理过的字符串返回不需要的结果,这些字符串包括“\u1”:

回文(“_eye”)——应该返回true,但它将是false

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

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

函数回文(str){
var clearString=str.toLowerCase().replace(/[^0-9a-z]/gi')。split(“”);
对于(变量i=0;i
请记住,false语句应该是第一个,而true语句必须在for循环之外
,否则它将在第一次匹配后中断函数并返回不准确的结果

这里是基准代码片段:

const stringLength=100000;//<<在此调整字符串长度
常量字符串=超弦(字符串长度);
log(`Random string length:${string.length}符号`);
基准(ArraySplitreversejoin方法);
基准(forLoopComparisonMethod);
函数阵列PLITREVERSEJOINE方法(str){
return str==str.split(“”).reverse().join(“”);
}
循环比较方法(str)的函数{
让string=str.split(“”);
对于(变量i=0;i}
“所以这个正则表达式只在字符串中保留字母和数字”和“\u”这个字符,并且\W对“\u”进行了否定,所以我们必须添加这个明确的语句。我知道了很多。你确定性能方面吗?我只是做了一个面试前的准备,并用你演示的for循环解决了这个问题,但帖子中的答案也指向了数组拆分反向连接方法。@CodeAt30,我完全肯定这一点:)你为什么不自己用更大的字符串来测试它呢?这里有一个演示:哈!在我的机器上快20倍!网络测验到此为止!为了我们信任的循环!
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;
}