Generate Regular Expression based on an input array
by BramVanroy
HTML
<h1>
Generate Regular Expression based on an input array
</h1>
<p>
In this example the input is <code>[0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 105, 106, 107, 256, 257, 258, 259, 260]</code>. The result is:
</p>
<p class="result"><code></code></p>
JavaScript
var arr = [0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 105, 106, 107, 256, 257, 258, 259, 260],
onesArray = [],
tensArray = [],
tensMultiArray = {},
hundredsArray = [],
hundredsMultiArray = {};
// MAIN
function regexGenerator(arr) {
orderSplitter(arr);
var onesRegexString = onesToRegex(onesArray);
var tensRegexString = tensToRegex(tensArray);
var hundredsRegexString = hundredsToRegex(hundredsArray);
// Don't forget start/end points ^$
var regex = "(^(" + onesRegexString + ")$)|(^(" + tensRegexString + ")$)|(^(" + hundredsRegexString + ")$)";
$(".result code").text(regex);
}
regexGenerator(arr);
// Split input array in ones (1 digit), tens (2 digits), hundreds (3 digits)
// Can be extended to include others
function orderSplitter(numberArray) {
$(numberArray).each(function(index, element) {
if (element < 10) {
onesArray.push(element);
} else if (element < 100 && element > 9) {
tensArray.push(element);
} else if (element < 1000 && element > 99) {
hundredsArray.push(element);
}
});
}
/* Following functions expect an array as input */
function onesToRegex(ones) {
var onesRegex = "";
for (var i = 0; i < ones.length; i++) {
var e = ones[i];
// If this element is not the first element, and it is equal to
// the previous number + 1
if (i > 0 && e == (ones[i - 1] + 1)) {
// If this element is NOT equal to the next element - 1
// Will also return true if next item does not exist
if (e != (ones[i + 1] - 1)) {
onesRegex += e + "]";
}
}
// If this item is a (new) first item in a list
else {
if (onesRegex != "") onesRegex += "|";
onesRegex += "[" + e + "-";
}
}
return onesRegex;
}
function tensToRegex(tens) {
var tensRegex = "";
// Loop the array and break the number down in digits
// E.g. 13 -> ten = 1; one = 3
$(tens).each(function(index, element) {
var ten = Math.floor(element / 10),
...