Регулярное выражение игнорирует порядок захвата группы
Пожалуйста, откройте следующий URL в chrome => https://regex101.com/r/rWLAOU/1/
Regex:
\b(f|fall|w|winter|s|spring|su|summer)\b\s*(?<!\d)(\d{4}|\d{2})(?!\d)
Тестовые строки:
Fall 2018
fall 18
2016 Fall
F2016
Fall2016
Определенное мной регулярное выражение отлично работает для всех тестовых строк, кроме случаев, когда меняется порядок захвата группы (осень 2016 или 16f или 18Su). Есть ли способ в регулярном выражении игнорировать упорядочение групп захвата вашего RegExp?
1 ответ
Вы можете использовать чередование с двумя частями, где год и сезон меняются местами, а затем захватывать только совпадающие снимки:
\b(?:(f(?:all)?|w(?:inter)?|s(?:pring|u(?:mmer)?)?)\s*(\d{2}(?:\d{2})?)|(\d{2}(?:\d{2})?)\s*(f(?:all)?|w(?:inter)?|s(?:pring|u(?:mmer)?)?))\b
Посмотреть демо-версию регулярного выражения
Я заключил контракт с вашими альтернативами, чтобы сделать сопоставление более эффективным: все альтернативы должны совпадать только в уникальных местах. Кажется, словесных границ достаточно для вашего случая.
В JS вы можете построить шаблон динамически:
var strs = ['Fall 2018','fall 18','2016 Fall','F2016','Fall2016'];
var season = "(f(?:all)?|w(?:inter)?|s(?:pring|u(?:mmer)?)?)";
var year = "(\\d{2}(?:\\d{2})?)";
var p = new RegExp("\\b(?:" + season + "\\s*" + year + "|" + year + "\\s*"+ season + ")\\b","i");
var results=[], m;
for (var s of strs) {
m = s.match(p);
if (m) {
if (m[1]) {
console.log(m[1],":", m[2]);
} else {
console.log(m[3],":", m[4]);
}
}
}