使RegEx组将行拆分为列

问题描述 投票:0回答:1

我在基于逗号的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},它将不起作用

我将如何完成?

javascript regex regex-group
1个回答
0
投票

[使用替换和拆分的组合来完成此任务有多种方法:

  1. 临时替换{...}中的逗号,分割逗号,恢复每个数组项中的逗号
  2. 以逗号分隔,然后合并从第一次出现{到最后一次出现}的数组项,并跟踪嵌套
  3. 使用负前瞻进行拆分以避免在{...}内用逗号拆分

这里是第一个选项的示例,其中我们暂时替换了{...}中的逗号:

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()将不可打印的字符恢复为逗号
© www.soinside.com 2019 - 2024. All rights reserved.