我们希望在管道符|
的实例上拆分一个字符串,但如果该字符前面有一个转义字符,则不会。 \|
。
ex我们希望看到以下字符串分为以下组件
1|2|3\|4|5
1
2
3\|4
5
我希望能够使用以下javascript函数split,它采用正则表达式。什么正则表达式我会分裂?我们是跨平台的,如果可能的话,我想支持IE,FF和Chrome的当前版本和之前版本(1版本)。
答案 0 :(得分:7)
而不是拆分,进行全局匹配(与词法分析器相同):
\\
或|
这样的事情:
var str = "1|2|3\\|4|5";
var matches = str.match(/([^\\|]|\\.)+/g);
快速解释:([^\\|]|\\.)
匹配除'\'
和'|'
之外的任何字符(模式:[^\\|]
)或(模式:|
)匹配任何字符转义字符(模式:\\.
)。 +
后面的([^\\|]|\\.)
告诉它与前一次或多次匹配:模式g
将匹配一次或多次。正则表达式文字末尾的{{1}}告诉JavaScript正则表达式引擎匹配全局模式,而不是只匹配一次。
答案 1 :(得分:1)
你正在寻找的是一个与正面表达相匹配的负面观察"。
这不是很好,但它应该为你分割列表:
var output = input.replace(/(\\)?|/g, function($0,$1){ return $1?$1:$0+'\n';});
这将获取您的输入字符串并替换所有' |'字符不会立即在' \'之后字符并替换为' \ n'字符。
答案 2 :(得分:0)
正在研究这个问题时发布了正则表达式解决方案。所以我只是继续写下没有它的一个。我做了一些简单的基准测试,它的速度更快(我希望它更慢......)。
不使用正则表达式,如果我明白你的意愿,这应该做的工作:
function doSplit(input) {
var output = [];
var currPos = 0,
prevPos = -1;
while ((currPos = input.indexOf('|', currPos + 1)) != -1) {
if (input[currPos-1] == "\\") continue;
var recollect = input.substr(prevPos + 1, currPos - prevPos - 1);
prevPos = currPos;
output.push(recollect);
}
var recollect = input.substr(prevPos + 1);
output.push(recollect);
return output;
}
doSplit('1|2|3\\|4|5'); //returns [ '1', '2', '3\\|4', '5' ]