与Javascript中的正则表达式相比,排除字母数字字符的内存密集程度更低吗?

时间:2017-09-06 23:44:25

标签: javascript regex validation

在技术访谈期间,我被要求实施一个基本的回文功能,在Javascript中排除非字母数字字符(例如,#34;一个人,一个计划,一个运河,巴拿马。")。我提出的代码基本上是这样的:

if(!empty($errors)) 
{
    // if there are items in our errors array, return those errors
    $data['input_valid'] = false;
    $data['errors']  = $errors;
} 
else 
{
    // If there are no errors process our form, then return a message
    $data['input_valid'] = true;
    $data['errors'] = $errors; // even though it is empty
    // etc

我的采访者告诉我:

  

使用正则表达式是过度的,容易出错。

我在采访中接受了这一说法,但事后进行研究后,我还没有找到一个好的选择。这个问题的answer表明,function skipNonAlphanumeric(str,i,j) { var regex = /[^a-zA-Z0-9]/; if(regex.test(str[i])) { i++; return skipNonAlphanumeric(str,i,j); }; if(regex.test(str[j])) { j--; return skipNonAlphanumeric(str,i,j); }; return {i: i, j: j}; }; function isPalindrome(str) { var j = str.length - 1; var i = 0; var indices, ci, cj; while(i < j) { indices = skipNonAlphanumeric(str,i,j); i = indices.i; j = indices.j; ci = str[i].toLowerCase(); cj = str[j].toLowerCase(); if(ci !== cj) { return false; }; j--; i++; }; return true; }; 使用charCodeAt()的效果更高,但我无法想象我会知道必要的字符代码来实现这样的解决方案。

我知道我的代码不一定是问题的最佳解决方案,但有没有人对我的采访者一直在寻找什么有任何想法?

2 个答案:

答案 0 :(得分:2)

这里使用正则表达式是可以接受的,但是多次使用一个(每个字符的字符)是一种浪费。如果您使用一个,则使用它一次性删除字符串中的字符,并对结果执行常规的回文测试。

这是一种替代方法,可以在没有正则表达式的情况下进行删除,并且不需要了解字符代码。

它将字符串转换为数组,并使用Set允许的字符作为this对象对其应用过滤器:

function isPalindrome(str) {
    str = [...str.toLowerCase()].filter(function (c) {
        return this.has(c);
    }, new Set('abcdefghijklmnopqrstuvwxyz0123456789'));
    for (var i = 0, j = str.length - 1; i < j; i++, j--) {
        if (str[i] !== str[j]) return false;
    }
    return true;
};  

console.log(isPalindrome('A man, a plan, a canal, Panama.'));

答案 1 :(得分:0)

只获取字母数字字符的老派方法是使用.charAt()并比较字符串,您不必知道字符代码。而且由于你正在通过char处理字符串char,你几乎可以免费获得反向字符串,所以你可以知道字符串是否只是比较它们的回文:

function isPalindrome(inputStr) {
  var i, char, str="", reverseStr="";
  
  for (i=0;i<inputStr.length;i++) {
    char=inputStr.charAt(i).toLowerCase();
    if ((char>='0' && char<='9') || (char>='a' && char<='z')) {
      str=str+char;
      reverseStr=char+reverseStr;
    }
  }
  console.log(str);
  return (str==reverseStr);
};

console.log(isPalindrome('A man, a plan, a canal, Panama.'));
console.log(isPalindrome('Not really a palindrome'));

如果您想要或需要使用.charCodeAt()四个原因,您只需使用获取'0' - '9''a' - 'z'的代码还.charCodeAt()

var tempStr='09az';
var code0=tempStr.charCodeAt(0), code9=tempStr.charCodeAt(1),
    codeA=tempStr.charCodeAt(2), codeZ=tempStr.charCodeAt(3);
console.log(code0,code9,codeA,codeZ);