首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用使用Ajv的正则表达式验证字符串?

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

Stack Overflow用户
提问于 2020-06-05 15:43:50
回答 2查看 10.9K关注 0票数 9

我试图用这个regex ^+0-9{9,12}$验证一个字符串(电话号码)

但是我得到了这个错误... .pattern should match format "regex" ...

我看过https://ajv.js.org等的文档,看过示例等等,尝试了很多变体,但似乎找不出我的代码出了什么问题。

这是我的代码:

代码语言:javascript
运行
复制
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/ (打开控制台/调试器查看完整错误)

EN

Stack Overflow用户

回答已采纳

发布于 2020-06-05 16:34:13

TL;博士

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

"\+""\\+"

当将正则表达式嵌入到字符串中时,请再次检查转义字符!

为什么?

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

代码语言:javascript
运行
复制
"\+" === "+"
//=> true

您看到的错误与数据无关,而是在架构的构造过程中。如你所见:

代码语言:javascript
运行
复制
const ajv = new Ajv;

try {
  ajv.compile({type: 'string' , pattern: '^\+[0-9]{9,12}$'});
} catch (e) {
  console.log(`ERR! ${e.message}`);
}
代码语言:javascript
运行
复制
<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("\+")意味着什么呢?让我们找出:

代码语言:javascript
运行
复制
// 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) }

相关

票数 10
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62219186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档