簡體   English   中英

如何使用 Ajv 的正則表達式驗證字符串?

[英]How do I validate a string using a regular expression with Ajv?

我正在嘗試使用此正則表達式^+[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/ (打開控制台/調試器以查看完整錯誤)

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 使用 new 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) }

有關的

除了@customcommander 評論。

關於格式state 的文檔:

regex:通過將字符串傳遞給 RegExp 構造函數來測試字符串是否是有效的正則表達式。


在 javascript 中,當您聲明一個字符串時,將解釋反斜杠。 這就是為什么你需要加倍反斜杠。

如果你不這樣做,那么你傳遞給 Avg 並很好地傳遞給new RegExp(...)的是字符串"^+[0-9]{9,12}$" ,這是一個不正確的正則表達式。

在此處輸入圖像描述


PS:好狗

您的正則表達式被錯誤地字符串化。 為避免錯誤,您可以使用本機正則表達式,如下所示:

{
  type: 'string', 
  pattern: /^\+[0-9]{9,12}$/.toString()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM