匹配'|'的Javascript正则表达式前面没有'\'(lookbehind alternative)

时间:2013-10-04 08:07:53

标签: javascript regex negative-lookbehind

我正在尝试通过分隔符name\|dial_num|032\|0095\\|\\0099|\9925拆分字符串|,但它会跳过\|。 我在此链接中找到了解决方案:Javascript regexp that matches '.' not preceded by '\' (lookbehind alternative)但它也会跳过\\|

正确的结果必须是:[name\|dial_num,032\|0095\\,\\0099,\9925]

该规则适用于\\\|\\\\\|等,|仍然是有效的分隔符,但如果\\\\|或更多,则不是。{ / p>

任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

通常的解决方法是使用match代替split

> s = "name\\|dial_num|032\\|0095\\\\|\\\\0099|\\9925"
"name\|dial_num|032\|0095\\|\\0099|\9925"
> s.match(/(\\.|[^|])+/g)
["name\|dial_num", "032\|0095\\", "\\0099", "\9925"]

作为旁注,即使JS确实支持lookbehinds,它也不是解决方案,因为(?<!\\)|也会错误地跳过\\|

答案 1 :(得分:0)

我挑战自己使用replace String方法..

我使用regex101.com(PCRE,Javascript和Python正则表达式引擎的流行在线测试程序)获得了正确的结果

// input : name\|dial_num|032\|0095\\|\\0099|\9925
// regex : ([^\\|](?:\\\\)*)\|                       with global flag
// replacement : $1,
// output: name\|dial_num,032\|0095\\,\\0099,\9925   <= seams okey right !?

测试..

var str = 'name\\|dial_num|032\\|0095\\\\|\\\\0099|\\9925';
str = str.replace(/([^\\|](?:\\\\)*)\|/g,'$1,');
console.log(str);
// > name\|dial_num,032\|0095\\,\\0099,\9925