legex
v1.1.2
Published
Regular Expression is too difficult to me, so I am looking for a descriptive way to write validators and combining validators by logic gate to generate new validator. And after I finished this library, I found that I can write 'native' Regular Expression
Downloads
3
Readme
legex (lesser regex)
Regular Expression is too difficult to me, so I am looking for a descriptive way to write validators and combining validators by logic gate to generate new validator. And after I finished this library, I found that I can write 'native' Regular Expression now...
Installation
npm i legex --save
Usage
const legex = require('legex');
// bundled file at 'legex/dist/' for browser
const c = legex.C;
const v = legex.V;
// Construction of Email Validation:
// Condition1 before '@':
const beforeAtType1 = c.And(
v.StartWithNon('<>()[]\\.,;:@ '), // not start with '<>()[]\\.,;:@ '
v.HasN(1, '@'), // has one '@''
v.BeforeNth(
1, '@', // before the first '@'
v.Exclude('<>()[]\\,;:@ ') // do not contain '<>()[]\\,;:@ '
)
);
// Condition2 before '@':
const beforeAtType2 = v.BeforeNth(
1, '@', // before the first '@'
v.QuoteBy(
'"', '"',
v.Anything()
)
);
// Combination of Conditions before '@':
const beforeAt = c.Or(beforeAtType1, beforeAtType2);
// Condition1 after '@':
const afterAtType1 = v.AfterNth(
1, '@', // after the first '@'
v.QuoteBy(
'[', ']',
v.IsIP() // format of IP
)
);
// A Validator for checking does the string contain at least 2 alphabets (and alphabets only)
const alphabets = c.And(
v.IsAlphabet(), // alphabets
v.LenGeq(2) // more than 2(inclusive)
);
// Condition2 after '@':
const afterAtType2 = c.And(
v.AfterNth(
1, '@', // after the first '@'
v.BeforeNth(
1, '.', // before the first '.'
v.IsWord() // is word character (a-z, A-Z, 0-9, _)
)
),
v.AfterNth(
1, '@', // after the first '@'
v.AfterNth(
1, '.', // after the first '.'
alphabets // contains at least 2 alphabets
)
)
);
// Combination of Conditions after '@':
const afterAt = c.Or(afterAtType1, afterAtType2);
// A full email Validator (It is not 100% correct, seems some conditions are wrong)
const email = c.And(beforeAt, afterAt);
// Tests:
console.log('Valid emails:');
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('aaa@[192.168.0.1]', email('aaa@[192.168.0.1]'));
assert('\".....\"@aaa.dds', email('\".....\"@aaa.dds'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('#!$%&\'*+-/=?^_`{}|[email protected]', email('#!$%&\'*+-/=?^_`{}|[email protected]'));
console.log('Invalid emails:');
assert('[email protected]', !email('[email protected]'));
assert('[email protected]', !email('[email protected]'));
assert('[email protected]', !email('[email protected]'));
assert('aaa@[19.23.2]', !email('aaa@[19.23.2]'));
assert('[email protected]', !email('[email protected]'));
// Email validation is common, so this library has a true validation for that XD
// https://stackoverflow.com/questions/46155/how-to-validate-an-email-address-in-javascript
console.log('Valid emails:');
assert('[email protected]', v.IsEmail().check('[email protected]'));
assert('[email protected]', v.IsEmail().check('[email protected]'));
assert('aaa@[192.168.0.1]', v.IsEmail().check('aaa@[192.168.0.1]'));
assert('\".....\"@aaa.dds', v.IsEmail().check('\".....\"@aaa.dds'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('[email protected]', email('[email protected]'));
assert('#!$%&\'*+-/=?^_`{}|[email protected]', email('#!$%&\'*+-/=?^_`{}|[email protected]'));
console.log('Invalid emails:');
assert('[email protected]', !v.IsEmail().check('[email protected]'));
assert('[email protected]', !v.IsEmail().check('[email protected]'));
assert('[email protected]', !v.IsEmail().check('[email protected]'));
assert('aaa@[19.23.2]', !v.IsEmail().check('aaa@[19.23.2]'));
assert('[email protected]', !v.IsEmail().check('[email protected]'));
// helper
function assert(description, boolean, msg) {
console.log(description);
if (!boolean)
throw new Error(msg);
else
console.log('pass');
}
Test
Test cases not yet finish
npm test
Build
npm run build