使RegEx组将行拆分为列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使RegEx组将行拆分为列相关的知识,希望对你有一定的参考价值。
我在基于逗号的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()
将不可打印的字符恢复为逗号
以上是关于使RegEx组将行拆分为列的主要内容,如果未能解决你的问题,请参考以下文章