重叠的命名捕获组
Overlapping named capturing groups
我正在使用命名的捕获组来验证和提取产品编号中的数据。产品编号的格式如下所示:
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
重叠,我不确定如何同时获取它们。因此我有以下问题:
- 只用一个正则表达式就可以吗?
- 如果是,我该如何完成?
我建议只为前两个字符和后面的四个字符设置单独的捕获组。然后,通过将前两个捕获组连接在一起形成 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]);
作为风格说明,我不喜欢使用命名捕获组,因为它们往往会导致难以阅读的臃肿正则表达式。
当然,只需将 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)
是的,您可以使用正则表达式捕获 gender_code,
(?=(..))(\d{6})(\d{1}[ABDE])(\d{3})\.(\d{3})
This is named groups regex but will only work in Chrome browser
命名捕获分组将在 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)
我正在使用命名的捕获组来验证和提取产品编号中的数据。产品编号的格式如下所示:
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
重叠,我不确定如何同时获取它们。因此我有以下问题:
- 只用一个正则表达式就可以吗?
- 如果是,我该如何完成?
我建议只为前两个字符和后面的四个字符设置单独的捕获组。然后,通过将前两个捕获组连接在一起形成 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]);
作为风格说明,我不喜欢使用命名捕获组,因为它们往往会导致难以阅读的臃肿正则表达式。
当然,只需将 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)
是的,您可以使用正则表达式捕获 gender_code,
(?=(..))(\d{6})(\d{1}[ABDE])(\d{3})\.(\d{3})
This is named groups regex but will only work in Chrome browser
命名捕获分组将在 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)