gpt4 book ai didi

javascript - JavaScript 正则表达式中的多个嵌套匹配

转载 作者:数据小太阳 更新时间:2023-10-29 05:28:43 25 4
gpt4 key购买 nike

尝试编写一个正则表达式来匹配 GS1 条形码模式 ( https://en.wikipedia.org/wiki/GS1-128 ),该模式包含 2 个或更多此类模式,这些模式具有标识符后跟一定数量的数据字符。

我需要一些匹配此条形码的东西,因为它包含 2 个标识符和数据模式:

人类可读,括号中的标识符:(01)12345678901234(17)501200

实际数据:011234567890123417501200

但是当只有一个模式时不应该匹配这个条形码:

人类可读:(01)12345678901234

实际数据:0112345678901234

似乎以下应该有效:

var regex = /(?:01(\d{14})|10([^\x1D]{6,20})|11(\d{6})|17(\d{6})){2,}/g;
var str = "011234567890123417501200";

console.log(str.replace(regex, "$4"));
// matches 501200
console.log(str.replace(regex, "$1"));
// no match? why?

出于某种奇怪的原因,一旦我删除 {2,} 它就可以工作,但我需要 {2,} 以便它只返回匹配项不止一场比赛。

// Remove {2,} and it will return the first match
var regex = /(?:01(\d{14})|10([^\x1D]{6,20})|11(\d{6})|17(\d{6}))/g;
var str = "011234567890123417501200";

console.log(str.replace(regex, "$4"));
// matches 501200
console.log(str.replace(regex, "$1"));
// matches 12345678901234
// but then the problem is it would also match single identifiers such as
var str2 = "0112345678901234";
console.log(str2.replace(regex, "$1"));

我该如何进行这项工作,以便它仅在存在一组以上的匹配组时才匹配和提取数据?

谢谢!

最佳答案

您的 RegEx 在逻辑上和句法上对于 Perl 兼容正则表达式 (PCRE) 都是正确的。我认为您面临的问题是 JavaScript 在重复捕获组方面存在问题。这就是为什么在您取出 {2,} 后 RegEx 可以正常工作的原因。通过添加量词,JavaScript 将确保返回最后一个匹配项。

我建议删除 {2,} 量词,然后以编程方式检查匹配项。我知道这对 RegEx 的忠实粉丝来说并不理想,但c'est la vie

请看下面的片段:

var regex = /(?:01(\d{14})|10([^\x1D]{6,20})|11(\d{6})|17(\d{6}))/g;
var str = "011234567890123417501200";

// Check to see if we have at least 2 matches.
var m = str.match(regex);
console.log("Matches list: " + JSON.stringify(m));
if (m.length < 2) {
console.log("We only received " + m.length + " matches.");
} else {
console.log("We received " + m.length + " matches.");
console.log("We have achieved the minimum!");
}

// If we exec the regex, what would we get?
console.log("** Method 1 **");
var n;
while (n = regex.exec(str)) {
console.log(JSON.stringify(n));
}

// That's not going to work. Let's try using a second regex.
console.log("** Method 2 **");
var regex2 = /^(\d{2})(\d{6,})$/;
var arr = [];
var obj = {};
for (var i = 0, len = m.length; i < len; i++) {
arr = m[i].match(regex2);
obj[arr[1]] = arr[2];
}

console.log(JSON.stringify(obj));

// EOF

希望对您有所帮助。

关于javascript - JavaScript 正则表达式中的多个嵌套匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42287252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com