我试图用这个regex ^+0-9{9,12}$验证一个字符串(电话号码)
但是我得到了这个错误... .pattern should match format "regex" ...
我看过https://ajv.js.org等的文档,看过示例等等,尝试了很多变体,但似乎找不出我的代码出了什么问题。
这是我的代码:
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!');
}链接到JSFiddle:http://jsfiddle.net/xnw2b9zL/4/ (打开控制台/调试器查看完整错误)
发布于 2020-06-05 16:34:13
TL;博士
正则表达式在文字表示法形式中是有效的,但在嵌入到字符串中的构造函数形式中是无效的。
"\+"❌"\\+"✅
当将正则表达式嵌入到字符串中时,请再次检查转义字符!
为什么?
因为无用的转义字符将被忽略。如果不是为了构造正则表达式,则没有理由转义'+'字符:
"\+" === "+"
//=> true您看到的错误与数据无关,而是在架构的构造过程中。如你所见:
const ajv = new Ajv;
try {
ajv.compile({type: 'string' , pattern: '^\+[0-9]{9,12}$'});
} catch (e) {
console.log(`ERR! ${e.message}`);
}<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/6.12.2/ajv.min.js"></script>
但深入挖掘,这与Ajv也没有任何关系。Ajv确实提到:
Ajv使用新的RegExp(value)来创建用于测试数据的正则表达式。
请参阅https://ajv.js.org/keywords.html#pattern
那么做new RegExp("\+")意味着什么呢?让我们找出:
// similar error because "\+" and "+" are the same string
try { new RegExp("\+") } catch (e) { console.log(e.message) }
try { new RegExp("+") } catch (e) { console.log(e.message) }
相关
发布于 2020-06-05 15:56:02
除了@定制指挥官的评论。
关于格式化的文档指出:
regex:通过将字符串传递给RegExp构造函数来测试字符串是否是有效的正则表达式。
在javascript中,当您声明一个字符串时,反斜杠将被解释。所以你需要把反斜杠翻一番。
如果不这样做,那么您要传递给Avg和new RegExp(...)的是字符串"^+[0-9]{9,12}$",这是一个不正确的RegExp。

PS:好狗
https://stackoverflow.com/questions/62219186
复制相似问题