2012-09-05 4 views
5

私は分割したファイルから文字列を読みました。キャラクター。 |たとえば、文字列はいつも私にこれらの5つのサブストリングのいずれかが含まれている場合、上記の場合にはJavascript - エスケープされていない文字の文字列を分割する正規表現。 |しかし、を無視する|

["1", "test pattern", "prefix", "url", "postfix"] 

問題がでてくるされている5つのサブストリングを与えなければならない

1|test pattern|prefix|url|postfix 

ので、分割されキャラクター。私はエスケープされた\

1|test pattern|prefix|url \| title |postfix 

ここで、string.split( '|')を使用しても希望の結果が得られないことがわかります。目的の結果は

["1", "test pattern", "prefix", "url \| title ", "postfix"] 

私はいくつかの正規表現を試しましたが、これらのどれも希望の結果を得ていません。それはこのようになります

string.split(/[^\\]\|/) //["", "", "prefi", "$url \| $titl", " postfix"] 

は負lookbacksでのみ可能であるが、私は1つが残念ながら、Javascriptがlookbehindsをサポートしていません

+0

でアクションでそれを参照してください。私はあなたがいる文字を制御できませんそれを取ります文字列内で要素を区切るために使用されますか? – Patrick

+0

文字列の結果: >> var word = '1 |テストパターン|接頭辞| url \ | title | postfix '; >> word "1 |テストパターン|プレフィックス| URL |タイトル|後置" "1 |テストパターン|プレフィックス| url \\ | title | postfix 'の代わりに? –

+0

@Patrick:delimeterを変更することはできません。今では多くのファイルで使用されていますが、エスケープ文字を変更することができます。\ – Kashif

答えて

6

別の解決策:

"1|test pattern|prefix|url \\| title |postfix" 
.replace(/([^\\])\|/g, "$1$1|") 
.split(/[^\\]\|/); 

あなたはそれを動作させるために、別のバックスラッシュで最初の文字列にあなたのバックスラッシュをエスケープする必要があります、言った:

"1|test pattern|prefix|url \\| title |postfix" 
         ^

hereデモが利用可能に取り組んでいます。あなたが興味を持っているすべての出現箇所一致する可能性が

+0

+1これは本当に素晴らしいものです。 – Christoph

+0

これは質問に記載された文字列に対して機能しますが、失敗します。 1 |テストパターン|プレフィックス| url \\ | \\ | title | postfix – Kashif

+0

@Kashif [明らかに](http://jsfiddle.net/s5stR/1/)、それは動作します... – sp00m

3

を動作させることができませんでした。私は簡単な解決策を参照してくださいませんが、以下の回避策として適切であるかもしれない:

// use two backslashes in your string! 
var string = '1|test pattern|prefix|url \\| title |postfix'; 

// create an arbitrary unique substitute character 
var sub = "-"; 

string.replace(/\\\|/g,sub).split(/\|/); 

/* replace the substituted character again in your array of strings */ 

はまた、あなたがこのようなものを使用することができます関与空白がある場合

string.split(//\|\b//) 

は、しかし、これはいくつかの状況で失敗することがあります。

+0

単純な '境界'は 'replace'の必要なし... – Anirudha

+0

@Anirudhaオプションとして使用できますが、空白では失敗します。 – Christoph

+0

あなたを追加するのを忘れました\ b – Anirudha

1

代わりのsplit()を使用して:

var rx = /([^\\\|]|\\\|?)+/gi, item, items = []; 
while (item = rx.exec(str)) { 
    items.push(item[0]); 
} 

Fiddle

+0

+1問題を処理するための素晴らしいアイデアのために+1 解決策は完全には機能しませんが、予期しない空要素があります – Kashif

+0

@Kashif、ええ、アイテムに '[0]'がありませんでした。http ://jsfiddle.net/3uJYm/うまく動作しています – Lucero

関連する問題