使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},它将不起作用

我将如何完成?

答案

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

  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()将不可打印的字符恢复为逗号

以上是关于使RegEx组将行拆分为列的主要内容,如果未能解决你的问题,请参考以下文章

按一定数量将行拆分为列

重塑数据框以按组将值设为列[重复]

如何将行显示为列?

使用R将行转换为列,将列转换为行

SQL 将行合并为列

使用可能的组合将行转换为列