1

CSV 文字列に特定の数値 (文字列も) が含まれているかどうかを判断しようとしています。この場合は数値 3 です。これを試みるスクリプトをいくつか書きましたが、結果は常に null を返します。正規表現は、オンライン テスト ツールを使用する場合は機能しますが、スクリプトを介して使用する場合は機能しません。私が欠けているものを誰かが判断できますか?

これが私のコードです:

var csv = ["1,25,3","3", "1", "1,9,10", "2,4,5,6,7,11,33,3", "2,1,2,12,15,27"];

function contains(param){
    var regex = /(,)?\D[3]\D(,)?/g;
    return param.match(regex);
}

for(var i = 0; i < csv.length; i++){
  console.log(contains(csv[i]));
}

または、必要に応じて: JsFiddle

4

1 に答える 1

4

問題は、パターンの\D前後に文字 ()が必要なこと3です。例のすべて3の s は文字列の末尾にあるため、2 番目\Dは決して一致しません。あなたが望むのは、おそらく次のようなものです:

var regex = /(?:^|\D)3(?!\d)/;

文字列の末尾には、否定先読みを使用します。それは数字がないことを主張します。これは、数字以外の文字があると主張するよりも優れています (文字列の末尾でも機能するため)。理想的には、最初に同じものを使用しますが、これは JavaScript ではサポートされていません。つまり、文字列の先頭または数字以外の文字があるということです。実際 (Brad Koch が指摘したように)、この特定のケースでは、両方の条件が単語境界 (文字列内[a-zA-Z0-9_]の文字とそうでない文字の間の位置、または文字列の末尾) を構成します。したがって、次のように簡単に使用できます。

var regex = /\b3\b/;

ただし、入力に数字とコンマ以外の文字を含めることができる場合 (例: 1,text,2,a3b,somemoretext)、これらのアプローチはどれも十分ではありません。代わりに、カンマを明示的にチェックする必要があります。

var regex = /(?:^|,)3(?![^,])/;

また、実際の一致は必要なく、一致があるかどうかだけを知りたい場合は、test代わりに次を使用できます。

return regex.test(param);

これにより、配列の代わりにブール値が得られます(おそらく、わずかに効率的です)。

于 2012-12-09T19:21:09.360 に答える