mask pattern

Benchmark created by Oleksii Okhrymenko on


Preparation HTML

<script>

var mask = 'Hello, *****';
var aRegexpSafe = mask.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
var regexPattern = new RegExp(aRegexpSafe.replace(/\\\*/g, '.'));

var t1 = 'Hello, Abcde';
var t2 = 'Hello, World';
var t3 = 'Hello, me';


var maskRe = /(\*)+/gi;
var textRe = /^[\wа-я]+$/i;

var maskCache = {};

var preprocessMask = function(mask) {
  var tokens = [];
  while (match = maskRe.exec(mask)) {
    tokens.push({ index: match.index, length: match[0].length });
  }
  maskCache[mask] = tokens;
  return tokens;
};


var validateByMask = function(mask, input){
  var tokens = maskCache[mask] || preprocessMask(mask);
  
  if (mask.length != input.length)
    return false;
  
  var indexes = tokens.map(t => t.index);
  
  for (let i = 0; i < mask.length; ) {
    var maskIdx = indexes.indexOf(i);
    
    if (maskIdx != -1) {
      var token = tokens[maskIdx];
      var candidate = input.slice(token.index, token.index + token.length);
      if (!textRe.test(candidate))
        return false;
      i += token.length;
      continue;
    }
    
    if (mask[i] != input[i])
      return false;
    i++;
  }
  
  return true;
};


var dumb = function(mask, str) { 
  if(str.length != mask.length) return false;
 
  var match = true; 

  for(var i = 0; i<str.length; i++) {
      if(mask[i] == '*') continue;       
      if(str[i] != mask[i]) {
         match = false; 
         break;
      }
      return match; 
   }
}

</script>

Test runner

Ready to run.

Testing in
TestOps/sec
regexp
regexPattern.test(t1) === true;
regexPattern.test(t2) === true;
regexPattern.test(t3) === false;
ready
regexp2
validateByMask(mask, t1) === true
validateByMask(mask, t2) === true
validateByMask(mask, t3) === false
ready
dumb
dumb(mask, t1) === true
dumb(mask, t2) === true
dumb(mask, t3) === false
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.

  • Revision 1: published by Oleksii Okhrymenko on