如何在js中将字符串(' a | b \\ | c')拆分为数组(' a',' b | c'')?

时间:2017-11-10 23:24:51

标签: javascript string

我想将一个字符串分成2个部分,用'|'分隔,但如果'|'之前'\'分隔,则不会分开。

输入

example_str = 'a|b\\|c'

输出

st1 ='a'
st2 ='b|c'

5 个答案:

答案 0 :(得分:3)

这些任务可以通过状态机方法解决。简单地说,在你的情况下:你需要为每个角色建立周期。当我们看到\时,我们将当前状态移动到ESCAPE,当我们处于ESCAPE状态时,我们需要将状态重置为正常状态。如果我们看到|并且我们不处于ESCAPE状态,我们需要复制这部分文本并将其推送到数组。

您还应该决定a|b\\|c的结果应该是什么。

答案 1 :(得分: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);

答案 2 :(得分:1)

%start start

    %%
    start      : program             { $$ = parser::root->adopt($1); }
               ;
    program    : program structdef   { $$ = $1->adopt ($2); }
               |
               ;
    structdef  : TOK_STRUCT TOK_IDENT '{' fielddecls '}' {
               destroy($3);  destroy($5);
               $$ = $1->adopt($2, $4);}
               ;
    fielddecls : fielddecl {$$ = $1;}
               | fielddecl fielddecls {$$ = $1->adopt($2);}
               | {$$ = nullptr;}
               ;
    fielddecl  : basetype TOK_IDENT ';' {$$ = $1->adopt($2);}
               ;
    basetype   : TOK_VOID    {$$ = $1;}
               | TOK_INT     {$$ = $1;}
               | TOK_STRING  {$$ = $1;}
               | TOK_IDENT   {$$ = $1;}
               ;

    %%

答案 3 :(得分:0)

我相信没有办法实现你所要求的,因为在JS字符串文字' a | b \ | c'和' a | b | c'是等价的。 请检查一下:

var s1 = 'a|b\|c';
var s2 = 'a|b|c';
console.log(s1 === s2);

如果输入字符串被正确转义,您可以尝试将split与reduce结合使用。 对不起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];
}
, []);

答案 4 :(得分:-2)

无论如何你丢失了第一个管道,所以用别的东西替换它然后拆分:

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