2011-01-31 75 views
15

用正则表达式挣扎求解。我需要将一个字符串拆分成一个数组,无论它找到一个正斜杠。但是,如果正斜线前面有一个转义符,则不行。Javascript正则表达式 - 拆分字符串

例如,如果我有这个字符串:

hello/world 

我想它被分成数组,像这样:

arrayName[0] = hello 
arrayName[1] = world 

如果我有这样的字符串:

hello/wo\/rld 

我希望它被拆分成这样的数组:

arrayName[0] = hello 
arrayName[1] = wo/rld 

任何想法?

+0

本页面可能会有所帮助:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript不张贴这是一个*答案*,因为我现在没有时间拿出一个特定于你需要的例子。但我相当肯定你可以从那个职位上到那里。祝你好运。 – 2011-01-31 16:15:28

回答

3

以下是有点啰嗦,但会工作,而不是利用正则表达式与IE's broken split implementation可以避免这个问题。

function splitPath(str) { 
    var rawParts = str.split("/"), parts = []; 
    for (var i = 0, len = rawParts.length, part; i < len; ++i) { 
     part = ""; 
     while (rawParts[i].slice(-1) == "\\") { 
      part += rawParts[i++].slice(0, -1) + "/"; 
     } 
     parts.push(part + rawParts[i]); 
    } 
    return parts; 
} 

var str = "hello/world\\/foo/bar"; 
alert(splitPath(str).join(",")); 
0

这里是在rubular.com

+1

这对Ruby来说可能很好,但看起来并不像JavaScript,至少不用`split':http://jsbin.com/ipote5如果你想用另一种方式,我推荐张贴的。 – 2011-01-31 16:25:47

+2

请在这里发布解决方案,而不是在另一个网站上。 – user113716 2011-01-31 16:28:46

+1

这不起作用:``hello/wor \/rld“.match(/([az] +(\\\ /)?[az] +)/)`=>`[”hello“,”hello ',undefined]` – 2011-01-31 16:29:35

3

一个例子下面是适合于this blog post从技术的方式:

var str = "Testing/one\\/two\\/three"; 
var result = str.replace(/(\\)?\//g, function($0, $1){ 
    return $1 ? '/' : '[****]'; 
}).split('[****]'); 

Live example

考虑:

Testing/one\/two\/three 

结果是:

[0]: Testing 
[1]: one/two/three 

首先使用简单的“假”回顾后与[****]更换//更换\/,然后分割上[****]值。 (显然,任何将不会在字符串中替换[****]

0

对于短代码,你可以使用反向模拟负回顾后

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

var parts = reverse(myString).split(/[/](?!\\(?:\\\\)*(?:[^\\]|$))/g).reverse(); 
for (var i = parts.length; --i >= 0;) { parts[i] = reverse(parts[i]); } 

而且是有效的,它可能会更好分裂在/[/]/上,然后遍历数组并重新加入最后有逃逸的元素。

0

像这样的东西可能会照顾它。

var str = "/hello/wo\\/rld/"; 
var split = str.replace(/^\/|\\?\/|\/$/g, function(match) { 
    if (match.indexOf('\\') == -1) { 
    return '\x00'; 
    } 
    return match; 
}).split('\x00');  

alert(split); 
1

/* 如果从一个Ajax响应或数据的基础上查询, 就是让你的字符串,字符串没有被JavaScript的解释, 可以匹配,要么没有斜杠字符序列或者有斜线。 如果您要在脚本中定义字符串,请在比赛结束后将转义字符转义并去除。 */

var s='hello/wor\\/ld'; 
s=s.match(/(([^\/]*(\\\/)+)([^\/]*)+|([^\/]+))/g) || [s]; 
alert(s.join('\n')) 
s.join('\n').replace(/\\/g,'') 

/* returned value: (String) 
hello 
wor/ld 
*/ 
24

我不会为这个工作使用split()。匹配路径组件本身比分隔符更容易。例如:

var subject = 'hello/wo\\/rld'; 
var regex = /(?:[^\/\\]+|\\.)+/g; 
var matched = null; 
while (matched = regex.exec(subject)) { 
    print(matched[0]); 
} 

输出:

hello 
wo\/rld 

test it at ideone.com

相关问题