1

パイプ文字のインスタンスで文字列を分割したいのですが|、その文字の前にエスケープ文字がある場合はそうではありません\|

例: 次の文字列が次のコンポーネントに分割されることを確認したい

1|2|3\|4|5

1
2
3\|4
5

正規表現を取る次の JavaScript 関数 split を使用できることを期待しています。分割するにはどの正規表現を渡しますか? 私たちはクロスプラットフォームであり、可能であれば、IE、FF、および Chrome の現在および以前のバージョン (1 つ前のバージョン) をサポートしたいと考えています。

4

3 に答える 3

9

分割の代わりに、グローバル マッチを実行します (字句解析器と同じ方法)。

  • \\or以外のものにマッチ|
  • またはエスケープされた文字に一致

このようなもの:

var str = "1|2|3\\|4|5";
var matches = str.match(/([^\\|]|\\.)+/g);

簡単な説明: and (pattern: ) または (pattern: )([^\\|]|\\.)を除く任意の文字に一致し、エスケープされた任意の文字 (pattern: ) に一致します。前に 1 回以上一致するように指示した後: したがって、パターンは1 回以上一致します。正規表現リテラルの末尾にある は、JavaScript 正規表現エンジンに、パターンを 1 回だけ照合するのではなく、グローバルに照合するように指示します。'\''|'[^\\|]|\\.+([^\\|]|\\.)g

于 2012-10-05T21:52:10.050 に答える
1

あなたが探しているのは、「正規表現に一致する否定的な後読み」です。

これはきれいではありませんが、リストを分割する必要があります。

var output = input.replace(/(\\)?|/g, function($0,$1){ return $1?$1:$0+'\n';});

これにより、入力文字列が取得され、すべての「|」が置き換えられます '\' 文字が直前にない文字は、'\n' 文字に置き換えます。

于 2012-10-05T21:44:29.413 に答える
0

私がこれを調べていたときに、正規表現の解決策が投稿されました。だから私は先に進んでそれなしで1つ書いた。私はいくつかの簡単なベンチマークを行いましたが、それは-少し-速いです(私はそれが遅くなると思っていました...)。

正規表現を使用せずに、私があなたが望むものを理解した場合、これは仕事をするはずです:

function doSplit(input) {
    var output = [];
    var currPos = 0,
        prevPos = -1;
    while ((currPos = input.indexOf('|', currPos + 1)) != -1) {
        if (input[currPos-1] == "\\") continue;
        var recollect = input.substr(prevPos + 1, currPos - prevPos - 1);
        prevPos = currPos;
        output.push(recollect);
    }
    var recollect = input.substr(prevPos + 1);
    output.push(recollect);
    return output;
}
doSplit('1|2|3\\|4|5'); //returns [ '1', '2', '3\\|4', '5' ]
于 2012-10-05T22:06:17.840 に答える