RegExp Positive Lookbehind realization

by Ivan Gerasimenko

HTML

<h4>Positive Lookbehind realization</h4>
<h4>TODO: Negative Lookbehind realization</h4>

JavaScript

// regexp like: "patt1(patt2)" 
// where patt1 - lookbehind pattern and patt2 - patt to look for
function LookBehind(regexp) {
    var patt = new RegExp(regexp);

    return { 
        exec: function(str) {
            var pattExec = patt.exec(str);    
            return (pattExec !== null && pattExec.length > 1) ? 
                pattExec[1] : null;
        },
        regexp: function() {
            return "/" + regexp + "/";
        }
    }
}

var str1 = "20.12.2014";
var str2 = "20.12.2014 year";
var str3 = "20.12.201";
var str4 = "20.g2.2014";

var log = function(message) { console.log(message); };

var regexYear = LookBehind("\\d{2}\\.\\d{2}\\.(\\d{4})");
    
console.clear();
log("RegExp: " + regexYear.regexp());
log(padLeft(str1, 16) + " :: " + regexYear.exec(str1));
log(padLeft(str2, 16) + " :: " + regexYear.exec(str2));
log(padLeft(str3, 16) + " :: " + regexYear.exec(str3));
log(padLeft(str4, 16) + " :: " + regexYear.exec(str4));

var name1 = "Jan Samual Koen";
var name2 = "Paul Simpton Huwet";
var name3 = "Mark Tim Jones";
var name4 = "Lin Kan Jefferson";

var regexMiddleName = 
    LookBehind("[A-Z][a-z]+\\s([A-Z][a-z]+)\\s[A-Z][a-z]+");

log();
log("RegExp: " + regexYear.regexp());
log(padLeft(name1, 16) + " :: " + regexMiddleName.exec(name1));
log(padLeft(name2, 16) + " :: " + regexMiddleName.exec(name2));
log(padLeft(name3, 16) + " :: " + regexMiddleName.exec(name3));
log(padLeft(name4, 16) + " :: " + regexMiddleName.exec(name4));





//======== helpers =========
function padLeft(str, len, char) {
    var substitutionChar;
    if(typeof char === 'undefined')
        substitutionChar = ' ';
    else
        substitutionChar = char;
    
    var lengthOfPad = len + 1 - str.length;
    lengthOfPad = lengthOfPad > 0 ? lengthOfPad : 0;
    return str + Array(lengthOfPad).join(substitutionChar);
}