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

Javascript 如何在js中拆分字符串,但有一些例外,javascript,regex,string,split,Javascript,Regex,String,Split,我有这个字符串: a\,bcde,fgh,ijk\,lmno,pqrst\,uv 我需要一个JavaScript函数,该函数将按每个,分割字符串,但只有那些没有的函数前面有一个\ 如何做到这一点?您可以使用正则表达式进行拆分 下面是javascript中regex的链接 这里是作者使用正则表达式进行拆分的其他帖子的链接 从第一个链接开始,如果您注意到,您可以使用 ?!n匹配未后跟特定字符串n的任何字符串 [,]!\\ 由于JavaScript中的正则表达式不支持这种行为,所以我不打算编造一个

我有这个字符串:

a\,bcde,fgh,ijk\,lmno,pqrst\,uv
我需要一个JavaScript函数,该函数将按每个
分割字符串,但只有那些没有的函数前面有一个
\


如何做到这一点?

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

下面是javascript中regex的链接

这里是作者使用正则表达式进行拆分的其他帖子的链接

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

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

[,]!\\

由于JavaScript中的正则表达式不支持这种行为,所以我不打算编造一个巨大的黑客来模仿这种行为。相反,您可以只在所有逗号(
)上使用
split()
,然后将原本不应该拆分的部分粘回

快速“n”脏:

var str='a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.split(','),//在所有逗号上拆分
out=[];//输出
对于(var i=0,j=str.length-1;i
以下是我能想到的最简单的方法:

'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.replace(/([^\\]),/g, '$1\u000B').split('\u000B')
背后的想法是找到逗号没有加反斜杠前缀的每个地方,用字符串中出现的不常见字符串替换它们,然后用不常见字符串拆分


请注意,必须使用另一个反斜杠对逗号前的反斜杠进行转义。否则,javascript将表单
\,
视为转义逗号,并从中生成一个逗号!换句话说,如果你不能摆脱反斜杠,javascript会看到:
a\,bcde,fgh,ijk\,lmno,pqrst\,uv
,就像这
a,bcde,fgh,ijk,lmno,pqrst,uv
,另一个关于后面缺乏外观的丑陋的攻击:

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>');
功能版本{
返回s.split(“”).reverse().join(“”);
}
变量s='a\\、bcde、fgh、ijk\\、lmno、pqrst\\、uv';
//进入比扎罗世界。。。
var r=修订版(s);
//带着展望分开
var rparts=r.split(/,(?!\\)/);
//然后用双反转把它装回一起。
var-sparts=[];
while(部分长度)
sparts.push(rev(rparts.pop());
对于(变量i=0;i
演示:


我不认为我会在现实生活中这样做,但即使它确实让我感到肮脏,它也会起作用。认为这是一种好奇心,而不是你应该真正使用的东西。

< P>如果需要删除反斜杠也:


重复问题@这个问题是关于Java的。不幸的是,Javascript不知道lookbehinds,所以解决方案在这里不起作用。当然,可能的重复您可以使用正则表达式来拆分字符串。问题是如何按照作者要求的方式拆分字符串。是的,这不是作者想要的。我正在考虑循环。每个分割都用逗号,并检查前面的每个部分末尾是否有“/”。。。如果有,康卡特both@WTK第一个链接涵盖了答案,只是不想用勺子喂食。根据您的建议再次编辑了答案以包含更多信息。尽管@GoRoS,您能为您的想法编写准确的函数吗?是的,我也想看看。请注意,第一条评论中提供的链接是指具有不同正则表达式实现的Java。谢谢,为什么您要使用
~
?您可以使用任何东西来代替
~
。它必须是您确信不会出现在正在拆分的字符串中的某个字符(甚至比
~
长的字符),因为在下一步(替换后)我们将使用该字符拆分字符串。我建议使用任何不可打印的字符,而不是~。例如,它可以是\u000B,对应于零宽度空格的代码。什么没有做任何事情?:)请注意,冒号前的反斜杠必须使用另一个反斜杠转义。否则,javascript将表单
\,
视为转义冒号,并从中生成冒号!换句话说,如果你不想避开反斜杠,javascript会看到:
a\、bcde、fgh、ijk\、lmno、pqrst\、uv
就是这样的
a、bcde、fgh、ijk、lmno、pqrst、uv
。我认为这个解决方案看起来像是一个非常大的解决方案,而WTK@Eskat0n事实上,这是一个解决办法。。。与其他答案相比,解决方案的行数更多:)如果在非转义“,”之前有多个转义“,”,则此解决方案将失败。例如,
“ab\\、c\\、ed、fg”
。将(var i=0,j=str.length-1;i更改为:
while(var i=0,j=str.length-1;i
以解决此问题。
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>');
var test='a\\.b.c';
var result = test.replace(/\\?\./g, function (t) { return t == '.' ? '\u000B' : '.'; }).split('\u000B');
//result: ["a.b", "c"]