我在基于逗号的RegEx创建过程中遇到了麻烦。在下面的结构中,前19列应仅用逗号分隔,接下来的3列具有{ }
,但在这些括号内,我可以有更多括号(这是“脚本块”)。因此,对于最后3个,我想将所有内容都包含在,{}
这是结构
ID,AegisName,Name,Type,Buy,Sell,Weight,ATK[:MATK],DEF,Range,Slots,Job,Class,Gender,Loc,wLV,eLV[:maxLevel],Refineable,View,{ Script },{ OnEquip_Script },{ OnUnequip_Script }
以这个为例
1624,Lich_Bone_Wand,Lich's Bone Wand,5,20,,800,60:170,,1,2,0x00018314,18,2,2,3,70,1,10,{ bonus bInt,1; bonus bDex,1; bonus bAtkEle,Ele_Undead; .@r = getrefine(); bonus3 bAutoSpellWhenHit,"NPC_WIDECURSE",5,10+.@r; if(.@r>=9){ bonus bMatkRate,3; bonus bMaxSP,300; } },{},{}
我找到了这个([^\,]*),"x(19)."(\{.*\}),"x(2)."(\{.*\})
,但它在Perl中,因此我无法翻译成JavaScript。我可以看到,如果我将(\{.*\})
合并三次(像(\{.*\}),(\{.*\}),(\{.*\})
一样,它将使我获得最后3列,而([^\,]*),
则可以使我对第一列进行正确的拆分,但也会干扰最后几列,因此我尝试将其“限制”到前19个出现的位置,但是如果我这样做([^\,]*),{19}
,它将不起作用
我将如何完成?
[使用替换和拆分的组合来完成此任务有多种方法:
{...}
中的逗号,分割逗号,恢复每个数组项中的逗号{
到最后一次出现}
的数组项,并跟踪嵌套{...}
内用逗号拆分这里是第一个选项的示例,其中我们暂时替换了{...}
中的逗号:
function properSplit(line) {
return line
.replace(/(\{[^,]*,.*?\})(?=,)/g, function(m, p1) {
return p1.replace(/,/g, '\x01');
})
.split(/,/)
.map(function(item) {
return item.replace(/\x01/g, ',');
});
}
var str = "1624,Lich_Bone_Wand,Lich's Bone Wand,5,20,,800,60:170,,1,2,0x00018314,18,2,2,3,70,1,10,{ bonus bInt,1; bonus bDex,1; bonus bAtkEle,Ele_Undead; .@r = getrefine(); bonus3 bAutoSpellWhenHit,\"NPC_WIDECURSE\",5,10+.@r; if(.@r>=9){ bonus bMatkRate,3; bonus bMaxSP,300; } },{},{}";
console.log(JSON.stringify(properSplit(str), null, ' '));
输出:
[
"1624",
"Lich_Bone_Wand",
"Lich's Bone Wand",
"5",
"20",
"",
"800",
"60:170",
"",
"1",
"2",
"0x00018314",
"18",
"2",
"2",
"3",
"70",
"1",
"10",
"{ bonus bInt,1; bonus bDex,1; bonus bAtkEle,Ele_Undead; .@r = getrefine(); bonus3 bAutoSpellWhenHit,\"NPC_WIDECURSE\",5,10+.@r; if(.@r>=9){ bonus bMatkRate,3; bonus bMaxSP,300; } }",
"{}",
"{}"
]
说明:
replace()
用不可打印的字符{...}
替换'\x01'
中的逗号。它非贪婪地扫描到下一个},
模式,其中,
为正向超前split()
现在错过了{...}
中的逗号map()
将不可打印的字符恢复为逗号