如何在js中拆分字符串,但有一些例外

时间:2011-09-07 06:56:39

标签: javascript regex string split

我有这个字符串:

a\,bcde,fgh,ijk\,lmno,pqrst\,uv

我需要一个JavaScript函数,它会按每个,分割字符串,但只有那些\

}

如何做到这一点?

5 个答案:

答案 0 :(得分:11)

这是我能想到的最短的事情:

'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.replace(/([^\\]),/g, '$1\u000B').split('\u000B')

背后的想法是找到逗号没有前缀为反斜杠的每个地方,用字符串替换那些不常出现在字符串中的字符串,然后用 uncommon 字符串拆分。< / p>

请注意,逗号之前的反斜杠必须使用其他反斜杠进行转义。否则,javascript会将表单\,视为已转义的逗号,并只生成一个逗号!换句话说,如果你不能逃避反斜杠,那么javascript就会看到a\,bcde,fgh,ijk\,lmno,pqrst\,uv这个a,bcde,fgh,ijk,lmno,pqrst,uv

答案 1 :(得分:3)

由于JavaScript中的正则表达式不支持lookbehinds,因此我不打算做一个巨大的黑客来模仿这种行为。相反,您可以在所有逗号(split())上,,然后将首先不应拆分的部分粘合回来。

快速'n'脏demo

var str = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.split(','), // Split on all commas
    out = []; // Output

for (var i = 0, j = str.length - 1; i < j; i++) { // Iterate all but last (last can never be glued to non-existing next)
    var curr = str[i]; // This piece
    if (curr.charAt(curr.length - 1) == '\\') { // If ends with \ ...
        curr += ',' + str[++i]; // ... glue with next and skip next (increment i)
    }
    out.push(curr); // Add to output
}

答案 2 :(得分:1)

另一个丑陋的黑客围绕缺乏后视:

function rev(s) {
    return s.split('').reverse().join('');
}

var s = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv';

// Enter bizarro world...
var r = rev(s);

// Split with a look-ahead
var rparts = r.split(/,(?!\\)/);

// And put it back together with double reversing.
var sparts = [ ];
while(rparts.length)
    sparts.push(rev(rparts.pop()));

for(var i = 0; i < sparts.length; ++i)
    $('#out').append('<pre>' + sparts[i] + '</pre>');

演示:http://jsfiddle.net/ambiguous/QbBfw/1/

我不认为我会在现实生活中这样做,但它确实有效,即使它确实让我觉得很脏。认为这是一种好奇心,而不是你应该真正使用的东西。

答案 3 :(得分:0)

如果还需要删除反斜杠:

var test='a\\.b.c';
var result = test.replace(/\\?\./g, function (t) { return t == '.' ? '\u000B' : '.'; }).split('\u000B');
//result: ["a.b", "c"]

答案 4 :(得分:-1)

您可以使用正则表达式进行拆分。

以下是javascript http://www.w3schools.com/jsref/jsref_obj_regexp.asp

中正则表达式的链接

以下是其他帖子的链接,其中作者使用正则表达式进行拆分Javascript won't split using regex

如果您注意到,可以从第一个链接使用

创建正则表达式

?!n匹配任何未跟随特定字符串n

的字符串
[,]!\\