0

私は正規表現マスターではありませんが、js で次の結果が得られる正規表現を探しています。

var regex = ...;
var result = '"a b", "c, d", e f, g, "h"'.match(regex);

そして結果は

['"a b"', '"c, d"', 'e f', 'g', '"h"']

編集:

エスケープされた引用符を処理する必要はありません。これは、ユーザーが入力できる必要があるタグ付けフィールド用です。

タグ1、タグ2

だけでなく、

「ニューヨーク、アメリカ」、「ボストン、アメリカ」

EDIT2: 驚くほど素早い回答の minitech に感謝します。

4

3 に答える 3

3

ループを使用するだけです:

function splitCSVFields(row) {
    var result = [];
    var i, c, q = false;
    var current = '';

    for(i = 0; c = row.charAt(i); i++) {
        if(c === '"') {
            current += c;
            q = !q;
        } else if(c === ',' && !q) {
            result.push(current.trim());
            current = '';
        } else {
            current += c;
        }
    }

    if(row.length > 0) {
        result.push(current.trim());
    }

    return result;
}

注:String#trim次のように shiv できる requires が必要です。

if(!String.prototype.trim) {
    String.prototype.trim = function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}
于 2012-09-01T20:57:49.513 に答える
1

正規表現は、このタスクに最適なツールではない場合があります。代わりに、キャラクターをループして何をすべきかを決定することで、代わりにそれを実行したい場合があります。これを行う擬似コードを次に示します。

  • 文字をループします。
    • 引用ですか?
      • 引用フラグを切り替えます。
    • 引用フラグが設定されていない場合はコンマですか?
      • 蓄積された文字列を配列に追加します。
      • 蓄積された文字列をクリアします。
      • この繰り返しの残りの手順をスキップします。
    • 現在の文字を蓄積中の文字列に追加します。
  • 蓄積された文字列は空ではありませんか?
    • 蓄積された文字列を配列に追加します。
  • 必要に応じて、配列内のすべての文字列から空白を取り除きます。
    これは、文字列を配列に追加するときにも実行できます。
于 2012-09-01T20:57:15.373 に答える
0
var result = input.match(/(?:(?:"((?:[^"]|"")*)")|([^",\n]*))/g);
for (var i = 0; i < result.length; i++) {
  result[i] = result[i].replace(/^\s*/, "").replace(/\s*$/, "");
  if (result[i].length === 0) {
    result.splice(i--, 1);
  }
}

このコードをここでテストします。

于 2012-09-01T21:20:50.270 に答える