gpt4 book ai didi

javascript - 使用正则表达式来分割数组中的值,模式只起作用一半的时间

转载 作者:行者123 更新时间:2023-12-01 03:51:17 25 4
gpt4 key购买 nike

我正在尝试使用 RexExp 和 JS 来解析圣经经文。输出并不重要,因为我的一些正则表达式给了我漏报(除非我只是不了解 RegExp 的某些内容,这可能是这种情况)。

考虑以下函数:

function wtf() {
var s = "1:1-8, 3:5, 4:-8-10, 25-36, 5:1-6:1-26, 32-40, 55, 7:8",
exp1 = new RegExp('(\\d+:)?([\\d-]+(?=\\d:)|[\\d-]+)','g'),
result = s.split(exp1),
exp2 = new RegExp('\\d+[ :]+','g'), //tests for \d:
exp3 = new RegExp('\\d+[-]\\B','g'), //tests for \d-
exp4 = new RegExp('\\b\\d{1,3}[ -]+\\d{1,3}\\b','g'), //tests for \d-\d
exp5 = new RegExp('\\d:.*\\b','g'), //tests for d: followed by anything
exp6 = new RegExp('^\\d{1,3}$','g'), //tests for 1,12,123,etc.
output = [];

for(i=0;i<result.length;i++) {
var t = String(result[i]);
if(result[i] == "" | result[i] == ","| result[i] == " ," | result[i] == ", " | result[i] == undefined) {}
else if(exp5.test(result[i]) == true) {}
else {output[i] = result[i];}
}

output = output.filter(function(val){return val});

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

for(i=0;i<output.length;i++) {
if(exp2.test(output[i]) == true) { //tests for '3:','10:','100:', etc
console.log("Current Index: "+output[i]);
console.log("IF Branch: "+exp2);
}
else if(exp4.test(output[i]) == true){//tests for '1-1','12-34','123-456', etc.
console.log("Current Index: "+output[i]);
console.log("IF Branch: "+exp4);
}
else if(exp3.test(output[i]) == true) { //tests for '/\\d[-]\\B/g'
console.log("Current Index: "+output[i]);
console.log("IF Branch: "+exp3);
}
else if(exp6.test(output[i]) == true) { //tests for '1','12','123',etc.
console.log("Current Index: "+output[i]);
console.log("IF Branch: "+exp6);
}
else {
console.log("Current Index: "+output[i]);
console.log("IF Branch: else");
}
console.log("");
}
}

上面的代码将字符串解析为数组,删除无关的索引,对剩余索引重新编号,然后循环每个索引,运行测试以确定在每个索引上运行哪个代码块。

在大多数情况下,这工作得很好。该函数主要适用于遵循相应模式的字符串。但有一个问题,正如您在下面的函数输出中看到的:

["1:","1-8","3:","5","4:","-8-10","25-36","5:","1-","6:","1-26","32-40","55","7:","8"]

Current Index: 1:
IF Branch: /\d+[ :]+/g

Current Index: 1-8
IF Branch: /\b\d{1,3}[ -]+\d{1,3}\b/g

Current Index: 3:
IF Branch: /\d+[ :]+/g

Current Index: 5
IF Branch: /^\d{1,3}$/g

Current Index: 4:
IF Branch: /\d+[ :]+/g

Current Index: -8-10
IF Branch: /\b\d{1,3}[ -]+\d{1,3}\b/g

Current Index: 25-36
IF Branch: else

Current Index: 5:
IF Branch: /\d+[ :]+/g

Current Index: 1-
IF Branch: /\d+[-]\B/g

Current Index: 6:
IF Branch: /\d+[ :]+/g

Current Index: 1-26
IF Branch: /\b\d{1,3}[ -]+\d{1,3}\b/g

Current Index: 32-40
IF Branch: else

Current Index: 55
IF Branch: /^\d{1,3}$/g

Current Index: 7:
IF Branch: /\d+[ :]+/g

Current Index: 8
IF Branch: else

正如您所知,JSON.stringified 数组位于第一个,后面是数组索引的循环。对于每个索引,输出索引匹配的值和模式。您会注意到,当索引值为“25-36”、“32-40”和“8”时,会触发 else 分支,即使它们都明显匹配所使用的模式。此外,在每种情况下,前面的索引的格式都与触发 if 语句的适当分支的方式完全相同。

这到底是怎么回事?我不明白这里发生了什么?我正在检查以确保 regex101 上的模式正确,因此我确信它们正在工作。给出了什么?

最佳答案

您正在使用全局标志创建正则表达式,这会在匹配时保持其状态:

var re = /\d/g;
re.exec('123') // ['1']
re.exec('123') // ['2']
re.exec('123') // ['3']
re.exec('123') // null

因此,对于测试:

var re = /\d/g;
re.test('123') // true
re.test('123') // true
re.test('123') // true
re.test('123') // false

解决方案:当您不需要全局标志时,不要添加它。

总体简化:

const output = [
"1:1-8", "3:5", "4:-8-10", "25-36", "5:1-6:1-26", "32-40", "55", "7:8"];

const patterns = [
/\d+[ :]+/,
/\b\d{1,3}[ -]+\d{1,3}\b/,
/\d+[-]\B/,
/^\d{1,3}$/,
];

output.forEach(t => {
const matched = patterns.find(p => p.test(t));

console.log("Item: " + t);
console.log("Matched: " + matched);
console.log();
});

关于javascript - 使用正则表达式来分割数组中的值,模式只起作用一半的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167129/

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