RegEx需要在“|”上拆分javascript字符串但不是“\ |”

时间:2012-10-05 21:31:24

标签: javascript regex

我们希望在管道符|的实例上拆分一个字符串,但如果该字符前面有一个转义字符,则不会。 \|

ex我们希望看到以下字符串分为以下组件

1|2|3\|4|5

1
2
3\|4
5

我希望能够使用以下javascript函数split,它采用正则表达式。什么正则表达式我会分裂?我们是跨平台的,如果可能的话,我想支持IE,FF和Chrome的当前版本和之前版本(1版本)。

3 个答案:

答案 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' ]