2011-01-31 117 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

相關問題