使用Regex以CSV格式查找值

时间:2012-12-09 19:14:17

标签: javascript regex

我正在尝试确定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

1 个答案:

答案 0 :(得分:3)

问题是您的模式在\D之前和之后需要一个字符(3)。由于示例中的所有3都位于字符串的末尾,因此第二个\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);

这将为您提供一个布尔值而不是一个数组(这可能会使得效率略高)。