Регулярное выражение игнорирует порядок захвата группы - PullRequest
0 голосов
/ 19 мая 2018

Пожалуйста, откройте следующий 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 Ответ

0 голосов
/ 20 мая 2018

Вы можете использовать чередование с двумя частями, где год и сезон меняются местами, а затем захватывать только совпадающие захваты:

\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

См. Демонстрационную версию regex

Я заключил контракт с вашими альтернативами, чтобы сделать сопоставление более эффективным: все альтернативы должны совпадать только в уникальных местах.Кажется, что для вашего случая вполне достаточно границ слов.

В 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]); 
    }
  }
}
...