vee-validate正则表达式不起作用

时间:2018-06-20 18:46:05

标签: regex vee-validate

我需要使用vee-validate与此basic regex(?:\d{3}-)\d{3}-\d{4}来验证美国电话号码XXX-XXX-XXXX。正则表达式可以正常工作by itself,但不能与vee-validate一起使用,我不确定为什么。

标记

<!DOCTYPE html>
<html>
   <head>
      <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>
   </head>
   <body>
      <div id="app">
         <form action='#' method='POST'>

            <input v-validate="'required|regex:^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$'" :class="{'input': true, 'is-danger': errors.has('phone_primary') }" class="input is-info" type="text" name='phone_primary' value="$phone_primary" placeholder="404-555-1212" size="15">
            <span v-show="errors.has('phone_primary')" class="help is-danger">{{ errors.first('phone_primary') }}</span>

            <button class="button is-link" name='submitform' value='go'>Submit</button>
         </form>
      </div>
      <script>
         Vue.use(VeeValidate);
         new Vue({
           el: '#app',
           template: '#app',
           data: {
              phone_primary: null
           }
         });
      </script>

    </body>
</html>

Fiddle

正则表达式无法按预期运行,这是我做错了什么?

2 个答案:

答案 0 :(得分:3)

v-validate指令接受一个字符串值,该字符串值是由管道(|)分隔的验证列表。由于管道也在正则表达式模式内使用(作为替代运算符),因此字符串命令无效。解决方法是传递对象而不是字符串值。

此外,vee-validate中的正则表达式需要正则表达式定界符,在模式周围/个字符。

因此,您可以使用

v-validate="{ required: true, regex:/^(?:\(\d{3}\)|\d{3}-)\d{3}-\d{4}$/ }"

请参见the updated fiddle

请注意,正则表达式与空字符串不匹配,因此空输入将无效。

答案 1 :(得分:1)

我在使用内置的 v-validate 规则处理复杂的正则表达式时遇到了问题。我有一个正则表达式,用于检查密码字段是否包含字母和数字。 正则表达式是:/^(?=.[0-9])(?=.[a-zA-Z])([a-zA-Z0-9]+)$ /g

我花了很长时间试图使用内置的 regex: 参数来完成这项工作,但没有成功,所以最后我编写了自己的扩展程序。所以在我安装的:

this.$validator.extend('complex_password', {
   validate(value, args) {
   return Util.isComplexPassword(value);
   }
})

然后在我的 utils 库中添加一个函数:

 isComplexPassword(value) {
    
        tester = /^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/g
        isMatch = !tester.test(String(value))
    
        return !isMatch
    },

最后,将其连接到我的字段验证中:
v-validate="'required|min:8|complex_password'"