9

分割したファイルから文字列を読み取りました| キャラクター。たとえば、文字列は

1|test pattern|prefix|url|postfix

したがって、splitは常に5つの部分文字列を与える必要があります。上記の場合は次のようになります。

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

これらの5つのサブ文字列のいずれかに|が含まれている場合に問題が発生します。キャラクター。エスケープしたものとして保存します\|

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

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

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

いくつかの正規表現を試しましたが、どれも望ましい結果が得られません。

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

これはネガティブなルックバックでのみ可能であるように見えますが、私はそれを機能させることができませんでした

4

4 に答える 4

7

別の解決策:

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

そうは言っても、それを機能させるには、最初の文字列のバックスラッシュを別のバックスラッシュでエスケープする必要があります。

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

ここで利用可能な作業デモ。

于 2012-09-05T12:05:12.857 に答える
3

残念ながら、Javascriptは後読みをサポートしていません。簡単な解決策はありませんが、回避策として次の方法が適している可能性があります。

// 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//)

ただし、空白が含まれている場合、これは状況によっては失敗する可能性があります。

于 2012-09-05T11:43:46.767 に答える
1

使用する代わりに、split()関心のあるすべてのオカレンスに一致させることができます。

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

フィドルで実際に見てください

于 2012-09-05T12:24:45.090 に答える
0
'foo|bar\\|baz'.match(/(\\\||[^|])+/g)

これにより、エスケープされた分割文字または分割文字ではない任意の文字を構成する文字のすべてのシーケンスが検索されます。

于 2020-04-30T22:45:14.330 に答える