Перекрывающиеся именованные группы захвата - PullRequest
2 голосов
/ 27 апреля 2019

Я использую именованные группы захвата для проверки и извлечения данных из номера продукта. Формат номера продукта выглядит следующим образом:

1102961D048.075

Chars 1-2     gender_code   11
Chars 1-6     style         110296
Chars 7-8     width_code    1D
Chars 9-11    color_code    048
Char  12      delimiter     ignored
Chars 13-15   size_code     075

Мой текущий код выглядит так:

const validateMpn = (mpn) => {
  const regex = /(?<style>\d{6})(?<width>\d{1}[ABDE])(?<color_code>\d{3})\.(?<size_code>\d{3})/gi
  const match = regex.exec(mpn)

  if (!match) {
    return null
  }

  return match.groups
}

const str1 = '1102961D048.075'
const str2 = '1200322A001.085'
const match1  = validateMpn(str1)
const match2  = validateMpn(str2)

console.log(match1)
console.log(match2)

Поскольку gender_code и style перекрываются, я не уверен, как получить их обоих. Поэтому у меня есть следующие вопросы:

  1. Возможно ли это только одним регулярным выражением?
  2. Если да, как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2019

Конечно, просто поместите gender в группу style:

const validateMpn = (mpn) => {
  const regex = /(?<style>(?<gender>\d{2})\d{4})(?<width>\d{1}[ABDE])(?<color_code>\d{3})\.(?<size_code>\d{3})/gi
  const match = regex.exec(mpn)

  if (!match) {
    return null
  }

  return match.groups
}

const str1 = '1102961D048.075'
const str2 = '1200322A001.085'
const match1  = validateMpn(str1)
const match2  = validateMpn(str2)

console.log(match1)
console.log(match2)
1 голос
/ 27 апреля 2019

Да, вы можете захватить код_полу, используя положительный взгляд вперед, используя это регулярное выражение,

(?=(..))(\d{6})(\d{1}[ABDE])(\d{3})\.(\d{3})

Демонстрация регулярных выражений

Это регулярное выражение именованных групп, но оно будет работать только в браузере Chrome

, а именованная группировка захвата будет доступна в ECMAScript 2018 и поддерживается только в Chrome на данный момент.

Эта демонстрация JS будет работать в Chrome, поскольку на данный момент это единственная версия, поддерживающая EcmaScript2018,

const validateMpn = (mpn) => {
  const regex = /(?=(?<gender_code>\d\d))(?<style>\d{6})(?<width>\d{1}[ABDE])(?<color_code>\d{3})\.(?<size_code>\d{3})/gi
  const match = regex.exec(mpn)

  if (!match) {
    return null
  }

  return match.groups
}

const str1 = '1102961D048.075'
const str2 = '1200322A001.085'
const match1  = validateMpn(str1)
const match2  = validateMpn(str2)

console.log(match1)
console.log(match2)
1 голос
/ 27 апреля 2019

Я предлагаю просто иметь отдельные группы захвата для первых двух и четырех следующих персонажей. Затем сформируйте style, просто соединив вместе первые две группы захвата:

var input = "1102961D048.075";
var regex = /(.{2})(.{4})(.{2})(.{3}).(.{3})/g;
var match = regex.exec(input);
console.log("gender_code: " + match[1]);
console.log("style: " + match[1] + match[2]);

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

...