I want to split a string in 2 parts separated by '|', but not separated if '|' before is '\'.
Input
example_str = 'a|b\\|c'
Output
st1 ='a'
st2 ='b|c'
I want to split a string in 2 parts separated by '|', but not separated if '|' before is '\'.
Input
example_str = 'a|b\\|c'
Output
st1 ='a'
st2 ='b|c'
 
    
    These kinds of task can be solved by state machine approach. Simply saying, in your case: you need to build cycle for  each character. When we see \ we move current state to ESCAPE and on next interaction when we are in ESCAPE state we need to reset state to normal state. If we see | and we are not in ESCAPE state we need to copy this part of text and push it to array.
You should also decide, what should be the result for a|b\\|c.
 
    
    You can replace the \| with a unique string, then split on the pipe, then replace the unique string back to \|
Like this, 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);
 
    
    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];
 
    
    I believe that there is no way to achieve what you're asking about because in JS string literals 'a|b\|c' and 'a|b|c' are equivalent. Check this please:
var s1 = 'a|b\|c';
var s2 = 'a|b|c';
console.log(s1 === s2);
Still if input string is correctly escaped you may try combine split with reduce. Sorry for ES6 spread operator
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];
}
, []);
 
    
    You lose the first pipe anyhow, so replace it with something else and then split by that:
const [str1, str2] = 'a|b\|c'.replace('|', ' ').split(' ');
