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

问题是您的模式\D3. 由于3您示例中的所有 s 都位于字符串的末尾,因此第二个\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 回答