我有这个字符串:
a\,bcde,fgh,ijk\,lmno,pqrst\,uv
我需要一个JavaScript函数,它会按每个,
分割字符串,但只有那些不的\
如何做到这一点?
答案 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
的字符串[,]!\\