#javascript #jquery #arrays #regex
#javascript #jquery #массивы #регулярное выражение
Вопрос:
Я пытаюсь отфильтровать массив строк с помощью функции jQuery grep, но она пропускает элементы в массиве. Если я выполняю отладку через код, все условия возвращают true, но если я запускаю код без отладки, он пропускает второй элемент.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery.grep demo</title>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<p></p>
<script>
var arr = [ { value : "A1-99-101"}, { value : "A1-99-102"}, { value : "A1-99-109" } ];
var regex = /(?=.*?bA1.*b).*/ig;
var newarr = jQuery.grep(arr, function( n, i ) {
return (regex.test(n.value));
});
var printarr = '';
for (var i = 0; i < newarr.length; i) {
printarr = newarr[i].value ',';
}
$( "p" ).text( printarr );
</script>
</body>
</html>
Ответ №1:
У вас возникла проблема из-за g
изменения в вашем регулярном выражении ( .../ig
). Это заставляет регулярное выражение продолжать с последней совпадающей позиции. Вот что происходит:
- регулярное выражение соответствует
A1-99-101
и сохраняет позицию в 0 - на следующей итерации он перемещает позицию на 1, но не соответствует
A1-99-102
- затем регулярное выражение сбрасывает себя, потому что оно достигло конца строки
- и, наконец, он соответствует третьему элементу
A1-99-109
Чтобы исправить это, просто удалите g
модификатор:
var regex = /(?=.*?bA1.*b).*/i;
Также здесь есть ссылка на работу с рабочим кодом.
Редактировать
Также ваше регулярное выражение выглядит слишком сложным для меня. Если вы просто хотите фильтровать строки, начинающиеся с A1
, используйте следующее регулярное выражение:
var regex = /A1/i;
Комментарии:
1. Большое вам спасибо, Иван! И причина, по которой я использую это регулярное выражение, заключается в том, что я хочу найти всю строку, где ‘A1’ появляется в любом месте строки.
2. Если вы хотите
A1
сопоставить в любом месте, тогда/A1/i
он выполнит эту работу.