Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用带有Ajv的正则表达式验证字符串?_Javascript_Jsonschema_Ajv - Fatal编程技术网

Javascript 如何使用带有Ajv的正则表达式验证字符串?

Javascript 如何使用带有Ajv的正则表达式验证字符串?,javascript,jsonschema,ajv,Javascript,Jsonschema,Ajv,我试图用这个正则表达式验证字符串(电话号码)^+[0-9]{9,12}$ 但是我得到了这个错误 。模式应与格式“regex”匹配… 我已经阅读了etc的文档,查看了示例等,并尝试了许多变体,但似乎无法找出我的代码的错误 这是我的密码: const schema = { type: 'object', properties: { users: { type: 'array', items: {

我试图用这个正则表达式验证字符串(电话号码)^+[0-9]{9,12}$

但是我得到了这个错误
。模式应与格式“regex”匹配…

我已经阅读了etc的文档,查看了示例等,并尝试了许多变体,但似乎无法找出我的代码的错误

这是我的密码:

const schema = {
    type: 'object',
    properties: {
        users: {
            type: 'array',
            items: {
                type: 'object',
                properties: {
                    userReference: { type: 'string' },
                    phone: {
                        type: 'string'
                        , pattern: "^\+[0-9]{9,12}$" // If I remove this line, the model is seen as valid (and no errors)
                    }
                }
            }
        }
    },
    required: ['users'],
    errorMessage: { _: "One or more of the fields in the 'legacy' data path are incorrect." }
};

const schemaSample = {
    "users": [
        {
            "phone": "+25512345678", // should be valid
            "userReference": "AAA"
        },
        {
            "phone": "+5255 abc 12345678", // should be invalid
            "userReference": "BBB"
        }
    ]
};

var ajv = Ajv();
ajv.addSchema(schema, 'schema');

var valid = ajv.validate('schema', schemaSample);
if (valid) {
    console.log('Model is valid!');
} else {
    console.log('Model is invalid!');
}


链接到JSFIDLE:(打开控制台/调试器查看完整错误)

以及@customcommander comment

有关文件说明:

regex:通过传递 将其转换为RegExp构造函数


在javascript中,当您声明字符串时,反斜杠将被解释。这就是为什么你需要加倍反斜杠

如果不这样做,则传递给Avg的以及传递给
新RegExp(…)
的是字符串
“^+[0-9]{9,12}$”
,这是一个不正确的RegExp



PS:好狗

TL;DR

正则表达式在文字表示形式中有效,但在嵌入字符串的构造函数形式中无效

“\+”
❌ <代码>“\\+”✅

将正则表达式嵌入字符串时,请仔细检查转义字符

为什么?

因为无用的转义字符将被忽略。如果不是为了构造正则表达式,则没有理由转义
'+'
字符:

“\+”==“+”
//=>正确
您看到的错误与数据无关,而是在架构的构造中。正如你在这里看到的:

const ajv=新ajv;
试一试{
compile({type:'string',pattern:'^\+[0-9]{9,12}$'});
}捕获(e){
log(`ERR!${e.message}`);
}

你很可能忘了双重逃逸:
“\+”
应该是
“\\+”
我真的花了好几个小时在这个该死的东西上!!谢谢,这真的很管用。如果你将其作为答案发布,我会将其标记为正确,否则我会稍后回答我自己的问题。我认为我的正则表达式格式正确,因为我将其输入regex101并为其生成javascript,它生成了/^\+[0-9]{9,12}$/gm,但我现在看到它不是以字符串形式生成的。所以我从没想过要检查我的正则表达式。