web-dev-qa-db-ja.com

Javascript正規表現-分割文字列

正規表現の要件に苦しんでいます。スラッシュが見つかった場合は、文字列を配列に分割する必要があります。ただし、スラッシュの前にエスケープが付いている場合はそうではありません。

たとえば、この文字列がある場合:

hello/world

私はそれを次のように配列に分割したいと思います:

arrayName[0] = hello
arrayName[1] = world

そして、私がこの文字列を持っている場合:

hello/wo\/rld

私はそれを次のように配列に分割したいと思います:

arrayName[0] = hello
arrayName[1] = wo/rld

何か案は?

15
WastedSpace

以下は少し時間がかかりますが、機能し、正規表現を使用しないことで IEの壊れた分割実装 の問題を回避します。

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(",") );
3
Tim Down

この仕事にはsplit()は使いません。区切り文字よりも、パスコンポーネント自体を一致させる方がはるかに簡単です。例えば:

var subject = 'hello/wo\\/rld';
var regex = /(?:[^\/\\]+|\\.)+/g;
var matched = null;
while (matched = regex.exec(subject)) {
  print(matched[0]);
}

出力:

hello
wo\/rld

ideone.comでテストしてください

23
Alan Moore

このブログ投稿 のテクニックを応用した方法は次のとおりです。

var str = "Testing/one\\/two\\/three";
var result = str.replace(/(\\)?\//g, function($0, $1){
  return $1 ? '/' : '[****]';
}).split('[****]');

実例

与えられた:

Testing/one\/two\/three

結果は次のとおりです。

[0]: Testing
[1]: one/two/three

これは、最初に単純な「偽の」ルックビハインドを使用して/[****]に置き換え、\//に置き換えてから、[****]値で分割します。 (明らかに、[****]を文字列に含まれないものに置き換えます。)

3
T.J. Crowder

/ * 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
*/
1
kennebec

短いコードの場合、reverseを使用してネガティブルックビハインドをシミュレートできます

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
Mike Samuel

これが rubular.com の例です

0
Mikhail

このような何かがあなたのためにそれを世話するかもしれません。

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
Hemlock