【问题标题】:Regex failing again and again in javascript正则表达式在javascript中一次又一次失败
【发布时间】:2019-01-15 06:53:30
【问题描述】:

我有一个名字和姓氏的正则表达式。即使我根据正则表达式给出正确的输入,它也会失败。我尝试更改不同的正则表达式,但仍然失败。对于测试,我什至使用了唯一的数字正则表达式,但仍然失败。下面是我正在使用的代码。

<form id="register_form" action="{{url('/register')}}" method="post" accept-charset="UTF-8">
   <div class="col-sm-6">
      <div class="form-group">
            <label for="name">Name</label>
            <input type="text" id="first_name" class="form-control" placeholder="Enter Name" name="first_name">
      </div>
    </div>
</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/additional-methods.js"></script>

<script type="text/javascript">
    $.validator.addMethod(
        "regex",
        function(value, element, regexp) {
            var re = new RegExp(regexp);
            return this.optional(element) || re.test(value);
        },
        "Number Not valid."
    );

    $("#register_form").validate({
        rules: {
            first_name: {required:true, minlength:2, regex:"^[a-zA-Z]+((\\s|\\-)[a-zA-Z]+)?$"},
        },
        messages:   {
            first_name:{required:'First name is required',minlength:'First name should contain atleast two alphabets',regex:'Only alphabets allowed and it should not start with space.'},
        }
    );
</script>

我失败的输入是 Raj Shah,这应该可以正常工作。我检查了重复的输入 ID,但没有。我在那里检查了在线测试仪上的正则表达式,它工作正常。

【问题讨论】:

  • 在可以避免的情况下尽量不要使用new RegExp - 请改用正则表达式文字,这样您就不必双重转义`\`。
  • 您拥有的第一个正则表达式字符串将匹配 "First" "First Last""First-Last" - 也许您错误地使用了 validator.addMethod
  • 无法复制。 re.test('Raj Shah'); -> true 这不是正则表达式。
  • 我的猜测是 regexp 参数可能没有正确传递 - 一个最小、完整和可验证的示例会有所帮助
  • in regex:"^[a-zA-Z]+((\\s|\\-)[a-zA-Z]+)?$" ... regex: 键是什么意思?请尝试显示更多有意义代码以获得更多有意义帮助

标签: javascript jquery regex


【解决方案1】:

虽然您的 regex 模式似乎工作正常,但问题可能在于 regex 模式是如何传递的,它可能经历了转义过程,您的反斜杠字符通过在它之前添加另一个反斜杠再次转义。

如果您可以看到至少 3 个反斜杠而不是 2 个,则可以尝试将 regex 字符串记录到控制台。

您还应该尝试使用single quotes 而不是double quotes,这样反斜杠字符就不会插入到您的字符串中..

'^[a-zA-Z]+((\\s|\\-)[a-zA-Z]+)?$'

而不是

"^[a-zA-Z]+((\\s|\\-)[a-zA-Z]+)?$"

您也可以尝试在正则表达式中添加third 反斜杠:

"^[a-zA-Z]+((\\\s|\\\-)[a-zA-Z]+)?$"

【讨论】:

    【解决方案2】:

    虽然您的正则表达式没有错误并且您的输入应该通过,但您似乎遇到了验证器逻辑问题。我不确定这是否会有所帮助,但我建议将regex 参数和regexp 参数命名为相同以防万一,然后在验证方法之外编译regexp

    $.validator.addMethod(
      "regex",
      function(value, element, regex) {
        return this.optional(element) || regex.test(value);
      },
        "Number Not valid."
      );
    $("#register_form").validate({
      rules:
        {
          first_name: {
            required:true,
            minlength:2,
            regex:/^\p{L}+((\s|-)\p{L}+)?$/u},
          },
          messages: {
            first_name:{
              required:'First name is required',
              minlength:'First name should contain at least two letters',
              regex:'Only letters allowed and it should not start with space.'},
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多