2011-01-31 14 views
15

正規表現の要件に悩まされています。スラッシュが見つかると、配列に文字列を分割する必要があります。しかしスラッシュの前にエスケープがある場合はそうではありません。Javascript regex - split string

例えば、私はこの文字列がある場合:

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投稿はありませんこれは*答え*としてあなたが必要とするものに特化した例を考え出す時間がないからです。しかし、私はあなたがそのポストからそこに着くことができると確信しています。がんばろう。 –

答えて

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

乾杯!これは私が探していた解決策のようです。 – WastedSpace

0

ここでここでthis blog postにおける技術から適応方法だrubular.com

+1

Rubyにはうってつけかもしれませんが、少なくともJavaScriptで動作するようには見えません。少なくとも「split」ではありません。http://jsbin.com/ipote5別の方法で使用することを考えているなら、それを掲示する。 –

+2

別のサイトではなく、ここにソリューションを投稿してください。 – user113716

+1

これは動作しません: '' hello/wor \/rld ".match(/([az] +(\\\ /)?[az] +)/)' => '[" hello "、" hello "、undefined]' –

3

に例を示します

考える
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

ありがとう:)これは私に適したものです。 – WastedSpace

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); 
+0

最初に動作しますが、すべてで動作しません – ehudokai

+0

うん、確かです。 http://jsbin.com/uvuni4/edit – Hemlock

1

/* あなたはAjaxのレスポンスやデータベースのクエリからあなたの文字列を取得している場合は、 またはスラッシュをエスケープしました。 スクリプトで文字列を定義する場合は、エスケープをエスケープし、一致後にエスケープします。*/

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

+2

これは私にとって最高の答えです。 –

+1

合意。間違いなく最高の答え。 – Yobert