RegEx用于字母数字和某些特殊字符

时间:2017-07-04 06:47:04

标签: javascript regex

我正在尝试仅允许使用英文字母,数值和以下字符:

- # $ % & * ( ) [ ] , . / - _ +

我设法提出以下代码

<form id="accountForm" action="">
   <input type="text" name="my_input">
</form>

$(function() {

    $.validator.addMethod("accept", function(value, element, param) {
        return value.match(new RegExp("." + param + "$"));
    }, 'Only English is allowed');        


    $( "#accountForm" ).validate({
        rules: {
            my_input : {
                required: true,
                accept: '[a-zA-Z0-9@%#&()/+*$,._\\-]+$'
            }              

        }
    });
 });

但是有一些问题:

  1. 如果我尝试添加[ ],则代码完全停止工作
  2. 如果我在上面的列表中添加或不添加其他字符,则在任何字母表之后它都不会显示任何错误消息。示例:ABC你好
  3. 如果我只输入一封信,就会出错。
  4. 以下是我的代码演示:https://jsfiddle.net/w2p1rdbd/1/

    你能告诉我如何解决这个问题吗?

    非常感谢!

2 个答案:

答案 0 :(得分:1)

我没有看到在accept方法中操纵正则表达式的任何需要。 (new RegExp("." + param + "$"))。这将使您的regexend像.[a-zA-Z0-9@%#&()/+*$,._\\-]+$$一样。

该行的开头应该以{{1​​}}(匹配字符串的开头)为基础,以便在开头禁止外来字符。

我在您的示例中移除了^.,将$添加到&#34;原始&#34;正则表达式(以^结束)并且它似乎正在起作用。

您的代码已修改:

&#13;
&#13;
^[a-zA-Z0-9@%#&()/+*$,._\\-]+$
&#13;
$(function() {

        $.validator.addMethod("accept", function(value, element, param) {
            return value.match(new RegExp(param));
        }, 'Only English is allowed');        
        
        
        $( "#accountForm" ).validate({
            rules: {
                my_input : {
                    required: true,
                    accept: '^[a-zA-Z0-9@%#&()/+*$,._\\-]+$'
                }
            }
        });
});
&#13;
&#13;
&#13;

答案 1 :(得分:1)

首先,请注意JavaScript具有正则表达式类型,因此可以将正则表达式指定为不需要指定为字符串的语言元素,这样可以节省几个转义序列以及语法突出显示可以帮助你更好。

然后你这样做_

"." + param + "$"

这会改变你的正则表达式。点表示任何类的附加字符在开头匹配。因此,单个角色根本不匹配,您需要匹配的角色,第二个角色必须属于您指定的类别。然后你还在最后添加$。你的原始表达中也有这个角色:'[a-zA-Z0-9@%#&()/+*$,._\\-]+$',所以现在你得到了两次。但是其中一个被忽略了,所以虽然这没有用,但没有坏处。可能你打算使用"^" + param + "$",因为那意味着从开头(^)到结尾($)匹配,但是你不应该在两者中包括这些变量表达式和函数。

然后是[]的问题。你只需要在正则表达式中逃脱它们。但是你还需要为字符串转义它们,然后你需要转义字符串的正则表达式转义序列。所以很多逃脱。另请注意,这适用于破折号,但破折号的问题只要是[]序列的最后一部分就会被忽略。所以最后你的正则表达式需要"^[a-zA-Z0-9@%#&()/+*$,._\\-\\[\\]]+$"。 (开场[的转义是可选的)

但是如果你使用文字,那么你可以写/^[a-zA-Z0-9@%#&()/+*$,._\-\[\]]+$/,这是一个较少的转义序列。结果总是如此:

$(function() {
    $.validator.addMethod("accept", function(value, element, param) {
        return param.test(value);
    }, 'Only English is allowed');        


    $( "#accountForm" ).validate({
        rules: {
            my_input : {
                required: true,
                accept: /^[a-zA-Z0-9@%#&()/+*$,._\-\[\]]+$/
            }
        }
    });
});