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