奇怪的正则表达式问题

时间:2017-04-06 02:18:22

标签: javascript regex

我使用Javascript来验证模式,我基本上只想允许字母数字值和标点符号。奇怪的是,当我输入一个(或一个)后紧接着它失败的东西,但是如果我给它一个空间就可以了。我做错了什么?

$(document).on('blur', '#comment', function () {
      var rgx = /[A-Za-z0-9 _.,!"']$/;
      var value = $(this).val();
      if (!rgx.test(value) == true){
          $("#comment").focus();
          $("#commentError").val("Please use only alphabets, numbers and punctuations");
      }else{
        $("#commentError").val("");
      }
  });

测试案例:

传递

Input: ( a

失败
Input: (a

3 个答案:

答案 0 :(得分:1)

您当前的模式仅检查字符串中的最后一个字符。

您需要有一个检查整个字符串的模式。这可以通过使用^$锚点以及使用一个或多个量词*来实现(假设评论是可选的)。

你的正则表达式可以是:

/^[\w .,!"']*$//^[A-Z0-9 _.,!"']*$/i/^[u20-u22u27u2Cu2Eu30-u39u41-u5Au5F]*$/i

第一个是最简短的(我的偏好),第二个可能是最可读的,第三个是使用unicode并且是最难理解的。一切都会很快,所以速度并不是真正的标准。

这是JSFiddle Demo,其中包含一些改进和评论建议。

HTML:

<input id="comment" name="comment" value="( a">
<i> press tab to trigger validation</i><br>
<input id="commentError" value="Comment Limit: 25. Use only letters, numbers, and  punctuation.">

<!-- I have added "?" to your regex pattern because it seems permissible. -->
<!-- Invalid values: "(a", "( a", "12345678901234567890123456" -->
<!-- Valid values: "", "Hello World", "l0ts, "of go.od' st_uff!?" -->

<!-- Additional advice: if you are storing the input value in a database table,
     you should limit the field length to what the table column can hold.
     If, per se, you are saving as VARCHAR(255), then set the #comment field limit
     as 255 so that the value isn't truncated during saving. -->

CSS:

#comment{
    width:200px;
}
#commentError{
    display:none;
    width:400px;
}

JS:

$(document).on('blur','#comment',function(){
    // no variable declaration needed
    if(/^[\w .,!"'?]{0,25}$/.test($(this).val())){  // contains only valid chars w/ limit
        $("#commentError").hide();
    }else{
        $("#comment").focus();  // disallows focus on any other field
        $("#commentError").show();
    }
});

答案 1 :(得分:0)

以下是如何解决您的问题 - 存在一些差异,但您应该可以将其复制粘贴到您的代码中。

JSfiddle:https://jsfiddle.net/pg792z79/

<script>
    var str = "apples" // <-- this is your input string
    var patt = new RegExp('[A-Za-z0-9 _.,!"\'/$]*');
    if(patt.test(str)) {
        //success
        $("#commentError").val("");
    } else {
        //error - did not match regex
        $("#comment").focus();
        $("#commentError").val("Please use only alphabets, numbers and punctuations");
    }
</script>

答案 2 :(得分:-1)

/^[A-Za-z0-9 _.,!"']$/g;那就是它。