将模式发送到函数

时间:2016-11-08 09:16:59

标签: javascript regex input

我有一个个人功能,他会使用id和模式来检查输入。

var id, schema;
	function checkField(id, schema){
		var input = id.val();
		var pattern = schema;

		if (!input.match(pattern)){
			console.log('Input = '+input);
			console.log('Pattern = '+pattern);
			id.removeClass().addClass("error");
			$(".oke").css({display: 'none'});
		}else{
			console.log('Classe = ok');
			id.removeClass().addClass("ok");
			$(".nope").css({display: 'none'});
		}
	}

	// Vérification téléphone
	$("#tel").focusout(function(){
		checkField($(this), "/0[1-7,9]\d{8}/");
	});

	// Vérification code postale
	$("#cp").focusout(function(){
		checkField($(this), "/^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/");
	});

但if条件总是返回null!input.match(pattern))。 两个控制台日志返回输入中的数字写入,并且模式正确,为什么if始终为false?

2 个答案:

答案 0 :(得分:2)

当您将"/0[1-7,9]\d{8}/"传递给String#match()时,\之前的d被删除,因为它是一个未知的转义序列,而/位于/附近模式在模式中被视为文字,符号。因此,你没有匹配。此外,字符类中的^也被视为文字逗号,我相信您要将其从模式中删除。此外,如果您计划匹配整个字符串,则第一个模式在开始时缺少$,在结尾缺少"^0[1-79]\\d{8}$"锚点。通过/^0[1-7,9]\d{8}$/或 - 首选 - 使用正则表达式文字/^(0[1-9]|[1-8]\d|9[0-8]|2[AB])\d{3}$/(模式周围没有双引号)。

第二种模式可以缩短为if (!input.match(pattern)) - 再次注意,正则表达式文字符号周围没有双引号。

此外,建议将if (!pattern.test(input))替换为regex.test(str),因为str.match(regex)返回 true false {{1}将返回 null 或匹配数据的数组。

那么,您可以使用的是

if (!pattern.test(input)){
...

$("#tel").focusout(function(){
    checkField($(this), /^0[1-79]\d{8}$/);
});

$("#cp").focusout(function(){
    checkField($(this), /^(0[1-9]|[1-8]\d|9[0-8]|2[AB])\d{3}$/);
})

答案 1 :(得分:1)

JavaScript正则表达式模式不是字符串,您应该删除双引号。

$("#tel").focusout(function(){
    checkField($(this), /0[1-7,9]\d{8}/);
});

$("#cp").focusout(function(){
    checkField($(this), /^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/);
})