У меня есть простой сценарий, соответствующий эпизод серии кодов, как s01e02 или s09e11. Идея состоит в том, чтобы найти все коды эпизодов в предоставленном тексте и создать массив объектов, содержащий все найденные эпизоды.Сочетание регулярных выражений «GI» модификаторов не работает для отдельных слов
Сначала я использовал match()
, чтобы получить массив всех совпадающих кодов, затем прокручиваю коды, чтобы извлечь сезон и номер эпизода.
Проблема заключается в том, что при использовании одного и того же регулярного выражения с модификаторами /gi
как для нахождения всех совпадений, так и для извлечения деталей эпизода я получаю сообщение об ошибке: Uncaught TypeError: Cannot read property '1' of null
(см. Вывод консоли).
Случай 1 (отсутствие) - fiddle 1
var episodePatternGI = /s(\d{1,2})e(\d{1,2})/gi;
var matches = 'S3E1 hehehe bla s09e12'.match(episodePatternGI);
var episodes = [];
matches.forEach(function(val) {
var ep = episodePatternGI.exec(val);
episodes.push({
s: ep[1],
e: ep[2]
});
});
console.log(episodes);
Случай 2 (рабочий) - fiddle 2
var episodePatternGI = /s(\d{1,2})e(\d{1,2})/gi;
var matches = 'S3E1 hehehe bla s09e12'.match(episodePatternGI);
var episodes = [];
var episodePatternI = /s(\d{1,2})e(\d{1,2})/i; // g modifier removed
matches.forEach(function(val) {
var ep = episodePatternI.exec(val); // New pattern applied
episodes.push({
s: ep[1],
e: ep[2]
});
});
console.log(episodes);
Как вы можете видеть, во втором case Я использую тот же шаблон, но модификатор g
удален.
Почему не первый случай работает?
Точно ответ, который я искал. – lesssugar
Все, что вы избили меня до ответа. Я как раз собирался отправить – 4castle
Еще лучший ответ, хотя бы на самом деле * использовать * lastIndex' в ваших интересах и просто пропустить через 'exec()' до тех пор, пока он не вернет null. Поскольку в настоящее время регулярное выражение используется в два раза больше, чем должно быть. Пропустите часть массива совпадений. – 4castle