Перекрывающиеся именованные группы захвата
Я использую именованные группы захвата для проверки и извлечения данных из номера продукта. Формат номера продукта выглядит следующим образом:
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
Я не уверен, как получить их обоих. Поэтому у меня есть следующие вопросы:
- Возможно ли это только с одним регулярным выражением?
- Если да, как я могу это сделать?
3 ответа
Конечно, просто место 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)
Я предлагаю просто иметь отдельные группы захвата для первых двух и четырех следующих персонажей. Затем сформируйте 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]);
Как примечание стиля, я предпочитаю не использовать именованные группы захвата, потому что они имеют тенденцию приводить к раздутому регулярному выражению, которое трудно читать.
Да, вы можете захватить пол_кода, используя позитивный взгляд, используя это регулярное выражение,
(?=(..))(\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)