2017-11-10 139 views

回答

-2

你好歹失去了第一管,所以别的东西,然后通过拆分替换:

const [str1, str2] = 'a|b\|c'.replace('|', ' ').split(' '); 
+0

这根本不起作用。它不仅不考虑反斜杠(这是问题的全部),而且如果原始字符串包含空格,它也会中断。 – duskwuff

+0

严格地说,它确实适用于这个非常具体的情况,而不是隐含的一般问题。 –

+2

@RobHogan所以'return ['a','b \ | c'];' – Blorgbeard

1

,可随时更换\ |用一个唯一的字符串,然后拆分管道,然后将该唯一字符串替换回\ |

这样,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); 
3

这些类型的任务可以由状态机的方法来解决。简单地说,就你的情况而言:你需要为每个角色构建循环。当我们看到\时,我们将当前状态移动到ESCAPE,当我们处于ESCAPE状态时,我们需要将状态重置为正常状态。如果我们看到|并且我们不处于ESCAPE状态,则需要复制这部分文本并将其推送到数组。

你也应该决定,a|b\\|c应该是什么结果。

0

我相信没有办法实现你所要求的,因为在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]; 
} 
, []); 
+3

我想我们都假设OP意味着他的字符串中有一个字面意思,并且在发布他的问题时忘了逃避它。 – Blorgbeard

+0

可能。或者可能这只是一个初学者的错误... –

+1

无论哪种方式,这不会回答这个问题。 –

1
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]; 
相关问题