Правильно. В отличие от большинства вопросов, я сам не пытаюсь написать собственное выражение. Я пытаюсь генерировать регулярное выражение (JavaScript приправленный, который будет использоваться в HTML5
's pattern
attribute).Преобразование массива чисел в подходящее регулярное выражение
Учитывая массив чисел, дайте краткое, быстрое и правильное регулярное выражение, которое будет только соответствует данному входу. Я уже сделал часть работы, а именно те, [0-9]:
var ones = [0, 1, 2, 3, 4, 5, 8, 9],
onesRegex = "";
for (var i = 0; i < ones.length; i++) {
e = ones[i];
if (i > 0 && e == ones[i - 1] + 1) {
if (i != ones[i + 1] - 1) {
onesRegex += e + "]";
}
} else {
\t if (onesRegex != "") onesRegex += "|";
onesRegex += "[" + e + "-";
}
}
// Returns [0-5]|[8-9]
alert(onesRegex);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Это тогда может быть использовано в <input>
(да, JQuery разрешено):
$("input").attr("pattern", onesRegex);
Проблема, которую я испытываю, заключается в том, что я не уверен, как продолжить. Как вы видите выше, достаточно легко. Тем не менее, все становится все труднее, как только вы начинаете добавлять цифры, потому что вам приходится принимать во внимание так много вещей. Например, вы можете иметь [112, 358, 359, 360, 361], что должно привести к (112|(3(5[8-9]|6[0-1])))
, который уже довольно обширен для всего лишь пяти номеров.
Для моего проекта максимальное значение равно 500, поэтому все значения < 1000
должны быть проанализированы.
Я написал совсем немного, но многое предстоит сделать - мне нужно получить логику. Пока моя идея состоит в том, чтобы разделить число в единицах, десятки и сотни, и относиться к ним соответственно. Кроме того, соответствующая функция может опускаться до других функций. Например, разбор номера 512 мог разбить его на 5 и 12, 12 спустится до функции для десятичных знаков и т. Д. Это основная идея, но логика и структура отсутствуют.
Вот что у меня есть, но я также предоставляю a JSFiddle, с которым немного легче работать.
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 = [],
hundredsArray = [];
// MAIN
function regexGenerator() {
orderSplitter(arr);
// Do stuff
// Should return finished Regex as a string
}
// Split input array in ones (1 digit), tens (2 digits), hundreds (3 digits)
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 (i > 0 && e == ones[i - 1] + 1) {
if (i != ones[i + 1] - 1) {
onesRegex += e + "]";
}
} else {
onesRegex += "[" + e + "-";
}
}
return onesRegex;
}
function tensToRegex(tens) {
var tensRegex = "";
for (var j = 0; j < tens.length; j++) {
var f = tens[j],
ten = Math.floor(f/10),
one = f - (ten * 10);
}
return tensRegex;
}
function hundredsToRegex(hundreds) {
var hundredsRegex = "";
for (var k = 0; k < hundreds.length; k++) {
var g = tens[j],
hundred = Math.floor(g/100),
ten = Math.floor((g - (hundred * 100))/10),
one = g - (ten * 10);
}
return hundredsRegex;
}
Я смущен. Если у вас есть массив чисел, вы хотите, чтобы регулярное выражение соответствовало всем # или одному числу или что? – IMTheNachoMan
@IMTheNachoMan Регулярное выражение, которое может соответствовать всем числам в этом массиве. –
Вы можете просто создать шаблон типа '(100 | 200 | 212 | 213 | 214 | 357)' и т. Д. Для каждого номера, правильно? Забудьте о причудливом шаблоне и используйте только определенные значения? –