#javascript #arrays #regex #validation #matrix
#javascript #массивы #регулярное выражение #проверка #матрица
Вопрос:
Я создаю страницу для умножения массива, и мне нужно проверить формат массива перед действием. Текстовое поле должно принимать только массивы в этом формате: [[1,2,3],[4,5,6],[7,8,9]]
— матричный массив массивов строк.
Я пробовал использовать регулярные выражения, но я действительно не могу этого сделать. Есть ли другой способ?
Комментарии:
1. какую проверку вы пытаетесь создать?
2. Мне нужно проверить формат массива, который должен быть таким: [[1,2,3],[4,5,6],[7,8,9]].
3. Может ли элемент массива быть больше однозначных чисел? Например, ?
[[1111,2,3],[7777,4,5],[0000,6,7]]
4. ДА. Также отрицательные числа.
5. Можно ли включать пробелы
[1, 2, 3]
? Вы пытаетесь проверить, вводятся ли только числа?
Ответ №1:
попробуйте регулярное выражение, приведенное ниже
^ [ ([[[ d ,] ] ,) [[ d ,] ] ]$
все в одном окончательном решении…
может управлять пробелами…
Комментарии:
1. Спасибо, но это не работает для такого массива, как этот: [[1,2,3],[4,5,6]] или [[1,2,3],[4,5,6],[7,8,9], [10,11,12] ..
2. подождите, дайте мне разобраться с этим
3. итак, это помогает для вашего второго условия… вы добавляете комментарий
4. Это выглядит круто
Еще одна вещь: можете ли вы заставить его принимать пробелы между числами и массивами?
5. Не работает с десятичными числами, отрицательными числами, числами, начинающимися с плюса, числами в научной нотации, символами новой строки, табуляциями, …
Ответ №2:
Это может быть в непосредственной близости от
var arr = [[1,2,3],[4,5,6],[7,8,9]],
valid = arr.every(a => Array.isArray(a) amp;amp; a.length === 3 amp;amp; a.every(item => typeof item === "number"));
console.log(valid);
Ответ №3:
Вы можете использовать JSON.parse()
, Array.prototype.every()
var res;
try {
res = JSON.parse(document.querySelector("input").value)
.every(function(arr) {return arr.every(Number)});
console.log(res);
}
// handle `JSON.parse()` error
catch (e) {
console.log(e)
}
<input type="text" value="[[1,-2,3],[4,5,-6],[7,8,99999]]">
Комментарии:
1. очень круто .. к сожалению, не работает, когда в массивах есть элементы массива, такие как
<input type="text" value="[[[1],-2,3],[4,5,-6],[7,[8],99999]]">
2. @Redu
[[[1],-2,3],[4,5,-6],[7,[8],99999]]
— это не формат массива, описанный OP?3. OP говорит, что текстовое поле должно принимать только массивы в этом формате:
[[1,2,3],[4,5,6],[7,8,9]]
. Для меня это означает » нет[1,{0:2},3]
и нет[1,[2],3]
» . Я не так думаю ..?4. @Redu Хотя этот формат также можно обработать, слегка изменив
javascript
при ответе.5. @Redu Не уверен, что вы «неправильно думаете», хотя OP не включил эти примеры в вопрос или комментарии в качестве возможного ввода. С небольшими корректировками
javascript
любой из примеров входных данных, которыми вы поделились, может возвращать тот же результат, используя тот же исходный шаблон при ответе. Обратите внимание также, что ваше решение начинается с массива в качестве входных данных, а не строки; который будет иметь.value
<input>
элемент.
Ответ №4:
Хотя вы уже приняли ответ, я все же хотел бы предложить это решение:
function getValidArray(txt) {
try {
var arr = JSON.parse(txt);
} catch (e) {}
return Array.isArray(arr)
amp;amp; arr.length == 3
amp;amp; arr.every( sub => Array.isArray(arr)
amp;amp; sub.length === 3
amp;amp; sub.every ( v => typeof v == 'number' ) )
amp;amp; arr;
}
// I/O for snippet:
var inp = document.querySelector('input');
var out = document.querySelector('div');
inp.oninput = function() {
var txt = inp.value;
var result = getValidArray(txt);
out.textContent = result ? JSON.stringify(result) : 'invalid';
};
inp.oninput();
input { width: 100% }
Array: <input value=" [[1,88,-45.2], [1.2e 2, 1e-1,-0.9],[ 0,22, 1.33] ]">
<div></div>
Этот тест завершается успешно, когда текст представляет собой массив чисел размером 3×3.
Он будет принимать пробелы вокруг чисел, запятых, … и будет принимать отрицательные и десятичные значения, даже научные обозначения.