首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重叠命名捕获组

重叠命名捕获组
EN

Stack Overflow用户
提问于 2019-04-27 12:13:13
回答 3查看 68关注 0票数 2

我使用命名捕获组来验证和从产品编号中提取数据。产品编号的格式如下所示:

代码语言:javascript
复制
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

我的当前代码如下:

代码语言:javascript
复制
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_codestyle重叠,我不知道如何将两者都得到。因此,我有以下问题:

  1. 只有一个正则表达式就能做到这一点吗?
  2. 如果是,我怎样才能做到这一点?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-27 12:20:23

当然,只需将gender放在style组中即可:

代码语言:javascript
复制
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)

票数 4
EN

Stack Overflow用户

发布于 2019-04-27 12:18:20

我建议只为前两个和第四个字符设置单独的捕获组。然后,通过将前两个捕获组连接在一起,形成style

代码语言:javascript
复制
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]);

作为一个风格说明,我不喜欢使用命名捕获组,因为它们往往会导致膨胀的正则表达式,这是很难理解的。

票数 1
EN

Stack Overflow用户

发布于 2019-04-27 12:21:01

是的,使用这个正则表达式,你可以用正面的视角捕捉gender_code,

代码语言:javascript
复制
(?=(..))(\d{6})(\d{1}[ABDE])(\d{3})\.(\d{3})

Regex Demo

这是名为groups regex,但只能在Chrome浏览器中工作。

命名捕获分组将在2018年的ECMAScript中提供,目前仅在Chrome中得到支持。

这个JS演示将在Chrome中工作,因为这是目前支持EcmaScript2018的唯一一个。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55880435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档