我想将一个字符串分成2个部分,用'|'
分隔,但如果'|'
之前'\'
分隔,则不会分开。
输入
example_str = 'a|b\\|c'
输出
st1 ='a'
st2 ='b|c'
答案 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(' ');