如何在js中将字符串('a | b \\ | c')拆分为数组('a','b | c'')?
我想分割一个由'|'
分隔开的2个部分的字符串,但如果'|'
之前是'\'
,则不分开。如何在js中将字符串('a | b \ | c')拆分为数组('a','b | c'')?
输入
example_str = 'a|b\\|c'
输出
st1 ='a'
st2 ='b|c'
你好歹失去了第一管,所以别的东西,然后通过拆分替换:
const [str1, str2] = 'a|b\|c'.replace('|', ' ').split(' ');
这根本不起作用。它不仅不考虑反斜杠(这是问题的全部),而且如果原始字符串包含空格,它也会中断。 – duskwuff
严格地说,它确实适用于这个非常具体的情况,而不是隐含的一般问题。 –
@RobHogan所以'return ['a','b \ | c'];' – Blorgbeard
,可随时更换\ |用一个唯一的字符串,然后拆分管道,然后将该唯一字符串替换回\ |
这样,https://jsfiddle.net/gb3Ljugc/
const aUniqueStringNotFoundInData = '___UNIQUE_____';
let x = 'a|b\\|c'.replace('\\\|', aUniqueStringNotFoundInData).split('\|');
x = x.reduce((acc, val) => {
val = val.replace(aUniqueStringNotFoundInData, '\\\|');
return acc.concat(val);
},[])
console.log(x);
这些类型的任务可以由状态机的方法来解决。简单地说,就你的情况而言:你需要为每个角色构建循环。当我们看到\
时,我们将当前状态移动到ESCAPE
,当我们处于ESCAPE状态时,我们需要将状态重置为正常状态。如果我们看到|
并且我们不处于ESCAPE状态,则需要复制这部分文本并将其推送到数组。
你也应该决定,a|b\\|c
应该是什么结果。
我相信没有办法实现你所要求的,因为在JS中,字符串文字'a | b \ | c'和'a | b | c'是等价的。 选中此请:
var s1 = 'a|b\|c';
var s2 = 'a|b|c';
console.log(s1 === s2);
不过,如果输入的字符串是正确转义,你可以尝试用减少合并拆分。 对不起ES6传播运营商
var s = 'a|b\\|c';
var arr = s.split('|')
var result = arr.reduce((acc, item) => {
if (acc.length && acc[acc.length - 1] && acc[acc.length - 1].endsWith('\\')) {
acc[acc.length - 1] = acc[acc.length - 1].substring(0, acc.length - 1) + '|' + item;
return acc;
}
return [...acc, item];
}
, []);
我想我们都假设OP意味着他的字符串中有一个字面意思,并且在发布他的问题时忘了逃避它。 – Blorgbeard
可能。或者可能这只是一个初学者的错误... –
无论哪种方式,这不会回答这个问题。 –
var test = "a|b\\|c";
test = test.replace('\\|','%%');
var testArray = test.split('|')
for(x = 0; x < testArray.length; x++)
{
testArray[x] = testArray[x].replace('%%', '\\|');
}
var st1 = testArray[0];
var st2 = testArray[1];
您可在'.split()'函数 – mhodges
你会如何对待'一个使用正则表达式| b \\ | C'? –
@mhodges如何? Javascript的正则表达式不支持后顾断言... – duskwuff