У меня есть строка, и я хочу получить массив с индексами (позициями) символов в этой строке, которые не соответствуют определенным критериям регулярного выражения.
Проблема здесь в том, что если я напишу это так:
let match;
let reg = /[A-Za-z]|[0-9]/g;
let str = "1111-253-asdasdas";
let indexes = [];
do {
match = reg.exec(str);
if (match) indexes.push(match.index);
} while (match);
Оно работает. Он возвращает индексы всех символов, которые являются числовыми или буквенными. Но проблема в том, что если я попытаюсь сделать наоборот, с отрицательным прогнозом в Regex, вот так:
let match;
let reg = /(?!([A-Za-z]|[0-9]))/g;
let str = "1111-253-asdasdas";
let indexes = [];
do {
match = reg.exec(str);
if (match) indexes.push(match.index);
} while (match);
Это заканчивается бесконечным циклом.
Я хотел бы добиться того же результата, что и в первом случае, но с отрицательным регулярным выражением, поэтому в этом случае результат будет таким:
indexes = [4, 8]; // which are the indexes in which a non-alphanumerical character appears
Является ли цикл неправильным, или это выражение регулярного выражения тот, кто все испортил? Может быть, exec
не работает с отрицательными выражениями Regex?
Я бы понял, что выражение регулярного выражения не работает так, как я хотел (потому что оно может быть неправильно отформатировано), но я не понимаю бесконечный цикл, который заставляет меня думать, что exec
, возможно, не лучший способ достичь того, что я находясь в поиске.
g
и, таким образом, пытается сопоставить несколько вхождений шаблона, но поскольку ваш шаблон соответствует пустой строке, и вы не проверяете условие, еслиindex
равноlastIndex
, регулярное выражение не может продвигаться по строке. Используйте регулярное выражение для соответствия любым небуквенно-цифровым символам,/[\W_]/g
- person Wiktor Stribiżew   schedule 04.03.2019/[^A-Za-z0-9]/
- person Robin Zigmond   schedule 04.03.2019exec
заканчивается бесконечным циклом, и, кроме того, дает рабочий ответ для моего случая, который решает проблему. Благодарю вас! - person Unapedra   schedule 04.03.2019