我有一个字符串数组:
let transactions = [
" Date || Credit || Debit || Balance ",
"20/01/2019 || || 9.00 || 162.00",
"20/01/2019 || 90.00 || || 171.00",
"20/01/2019 || || 9.00 || 81.00",
"20/01/2019 || 90.00 || || 90.00"
];
我使用transactions.replace(/\s/g, '')
"Date||Credit||Debit||Balance20/01/2019||||9.00||162.0020/01/2019||90.00||||171.0020/01/2019||||9.00||81.0020/01/2019||90.00||||90.00"
,并且我尝试从中删除所有|
并将其替换为逗号。
这实际上不起作用transactions.replace(/|{2,}/g,",")
:
错误无效的正则表达式:/ | {2} /:无需重复
然后transactions.replace(/|{+}/g,",")
返回:
",D,a,t,e,|,|,C,r,e,d,i,t,|,|,D,e,b,i,t,|,|,B,a,l,a,n,c,e,2,0,/,0,1,/,2,0,1,9,|,|,|,|,9,.,0,0,|,|,1,6,2,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,9,0,.,0,0,|,|,|,|,1,7,1,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,|,|,9,.,0,0,|,|,8,1,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,9,0,.,0,0,|,|,|,|,9,0,.,0,0,"
我想要的只是csv格式:
"Date,Credit,Debit,Balance,20/01/2019,,9.00,162.00,20/01/2019,90.00,,171.00,20/01/2019,,9.00,81.00,20/01/2019,90.00,,90.00"
答案 0 :(得分:2)
您可以执行以下操作,将所有'||'
字符串替换为','
char:
let output = transactions.split('||').join(',')
看起来您的第一个.replace
没有添加'||'在数组中的元素之间,因此我建议您先使用transactions.join('||')
,然后再使用.replace
,然后再输入上面的代码。
完整的代码如下所示:
let transactions = [
" Date || Credit || Debit || Balance ",
"20/01/2019 || || 9.00 || 162.00",
"20/01/2019 || 90.00 || || 171.00",
"20/01/2019 || || 9.00 || 81.00",
"20/01/2019 || 90.00 || || 90.00"
];
let output = transactions.join('||') // 1. combine array with 2 '|' chars
.replace(/\s/g, '') // 2. remove all space characters
.split('||').join(','); // 3. replace '||' str with ','
console.log(output);
如果您想坚持使用.replace
功能,可以使用:
let output = transactions.replace(/\|{2}/g, ',');
这将在原始字符串中的任意位置匹配两个'|'
字符实例,并将它们替换为','
。这与您所拥有的非常相似,但是正如@Dan Dascalescu所提到的,您必须转义正则表达式中的|
字符,并且您必须摆脱{{1}中的逗号},因为它将匹配2个或更多{2,}
个字符。
这是完整代码中的样子:
'|'
答案 1 :(得分:2)
另一种方法可能是使用新的实验性flatMap()将每个string
映射到由||
拆分的数组,然后将trim()
应用于此新元素的每个元素数组以删除多余的空间,然后将这个新数组展平,最后我们可以将所有元素与,
连接起来以获得所需的伪CSV
。请注意,这种方法将保留相关的空格,例如,Date And Time
不会更改为DateAndTime
。
let transactions = [
" Date And Time || Credit || Debit || Balance ",
"20/01/2019 09:57:00 || || 9.00 || 162.00",
"20/01/2019 10:20:12 || 90.00 || || 171.00",
"20/01/2019 14:17:30 || || 9.00 || 81.00",
"20/01/2019 21:00:30 || 90.00 || || 90.00"
];
let out = transactions.flatMap(str => str.split("||").map(e => e.trim())).join(",");
console.log(out);
但是,如果您想要真实的CSV
格式:
CSV是定界数据格式,其字段/列由逗号分隔,记录/行由换行符终止。
然后,您应该考虑将new line (\n)
字符添加到每行新数据中,就像在下一种方法中一样:
let transactions = [
" Date And Time || Credit || Debit || Balance ",
"20/01/2019 09:57:00 || || 9.00 || 162.00",
"20/01/2019 10:20:12 || 90.00 || || 171.00",
"20/01/2019 14:17:30 || || 9.00 || 81.00",
"20/01/2019 21:00:30 || 90.00 || || 90.00"
];
let out = transactions.map(
str => str.split("||").map(e => e.trim()).join(",")
).join("\n");
console.log(out);
答案 2 :(得分:0)
我不太使用正则表达式,但是我希望.replace(/\|+/g,",")
可以正常工作。 (它应该找到任意数量的连续竖线字符,并用一个逗号替换很多字符。)
答案 3 :(得分:0)
您可以使用以下代码:
let output = transactions.join('||').replace(/\s/g, '').replace(/\|\|/g, ',');
答案 4 :(得分:0)
您可以通过||
连接数组元素,并根据捕获的组返回''
或,
使用replace和在回调使用函数中使用。
这将为您节省两次替换。
let str = [" Date || Credit || Debit || Balance ", "20/01/2019 || || 9.00 || 162.00", "20/01/2019 || 90.00 || || 171.00", "20/01/2019 || || 9.00 || 81.00", "20/01/2019 || 90.00 || || 90.00"];
let op = str.join('||').replace(/(\s+)|(\|\|)/g,
function(match,firstMatch, secondMatch){
return firstMatch ? '' : ','
})
console.log(op)