我正在尝试确定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
答案 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);
这将为您提供一个布尔值而不是一个数组(这可能会使得效率略高)。