Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I'm trying to validate a string(Phone number) with this regex ^+[0-9]{9,12}$

but I get this error ... .pattern should match format "regex" ...

I've been through the documentation at https://ajv.js.org etc. looked at examples etc. and tried a lot of variations, but can't seem to figure out what is wrong with my code.

Here is my code:

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!');
}

Link to JSFiddle: http://jsfiddle.net/xnw2b9zL/4/ (Open Console / Debugger to see the full error)

like image 959
LegionDev Avatar asked Jun 05 '20 15:06

LegionDev


People also ask

How to validate string using regular expression in Java?

Write a java program to validate string using Regular Expression. Given a string (s) apply the following rules. String should be only four characters long. 2. First character can be an alphabet or digit. 3. Second character must be uppercase ‘R’. 4. Third character must be a number between 0-9.

What does new regexp mean in AJV?

But digging deeper, it has nothing to do with Ajv either. Ajv does mention: Ajv uses new RegExp (value) to create the regular expression that will be used to test data. So what does it mean to do new RegExp ("\+")? Let's find out: Why do linters pick on useless escape character?

What are regular expressions in JavaScript?

Regular expressions are entities that let us look for patterns in strings. It’s a very useful too for searching for strings that has what we want or checking if a string has certain patterns for validation purposes.

How to validate a form in JavaScript?

Thus, Validating a form can be done through JavaScript in the web pages. It should be tie up with HTML which is a markup language. Although many other languages came into the picture for validations JavaScript is the basic way to learn how to understand the validations performed in the webpages.


Video Answer


2 Answers

TL; DR

Your regular expression is valid in a literal notation form but not in a constructor form where it is embedded into a string.

"\+""\\+"

When embedding a regular expression into a string, double check your escape characters!

Why?

Because useless escape characters will be ignored. If it wasn't for constructing a regular expression you have no reason to escape a '+' character:

"\+" === "+"
//=> true

The error you saw had nothing to do with the data, it was in the construction of the schema. As you can see here:

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>

But digging deeper, it has nothing to do with Ajv either. Ajv does mention:

Ajv uses new RegExp(value) to create the regular expression that will be used to test data.

See https://ajv.js.org/keywords.html#pattern

So what does it mean to do new RegExp("\+")? Let's find out:

// 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) }

Related

  • Why do linters pick on useless escape character?
like image 157
customcommander Avatar answered Oct 28 '22 22:10

customcommander


In addition to @customcommander comment.

The documentation about format state that :

regex: tests whether a string is a valid regular expression by passing it to RegExp constructor.


In javascript when you declare a string the backslashes will be interpreted. That's why you need to double the backslashes.

If you don't, what you are passing to Avg and in fine to new RegExp(...) is the string "^+[0-9]{9,12}$", which is an incorrect RegExp.

enter image description here


PS: nice dog

like image 1
Orelsanpls Avatar answered Oct 28 '22 23:10

Orelsanpls