'use strict' const assert = require('assert') const SRL = require('../') describe('Builder isMatching', () => { it('Simple Phone Number Format', () => { const regex = new SRL() .startsWith() .literally('+') .digit().between(1, 3) .literally(' ') .digit().between(3, 4) .literally('-') .digit().onceOrMore() .mustEnd() assert.ok(regex.isMatching('+49 123-45')) assert.ok(regex.isMatching('+492 1235-4')) assert.ok(!regex.isMatching('+49 123 45')) assert.ok(!regex.isMatching('49 123-45')) assert.ok(!regex.isMatching('a+49 123-45')) assert.ok(!regex.isMatching('+49 123-45b')) }) it('Simple Email Format', () => { const regex = new SRL() .startsWith() .anyOf((query) => { query.digit().letter().oneOf('._%+-') }) .onceOrMore() .literally('@') .anyOf((query) => { query.digit().letter().oneOf('.-') }) .onceOrMore() .literally('.') .letter().atLeast(2) .mustEnd() .caseInsensitive() assert.equal(regex.getMatch('sample@example.com')[0], 'sample@example.com') assert.equal(regex.getMatch('super-He4vy.add+ress@top-Le.ve1.domains')[0], 'super-He4vy.add+ress@top-Le.ve1.domains') assert.ok(!regex.isMatching('sample.example.com')) assert.ok(!regex.isMatching('missing@tld')) assert.ok(!regex.isMatching('hav ing@spac.es')) assert.ok(!regex.isMatching('no@pe.123')) assert.ok(!regex.isMatching('invalid@email.com123')) }) it('Capture Group', () => { const regex = new SRL() .literally('colo') .optional('u') .literally('r') .anyOf((query) => { query.literally(':').and((query) => { query.literally(' is') }) }) .whitespace() .capture((query) => { query.letter().onceOrMore() }) .literally('.') assert.ok(regex.isMatching('my favorite color: blue.')) assert.ok(regex.isMatching('my favorite colour is green.')) assert.ok(!regex.isMatching('my favorite colour is green!')) const testcase = 'my favorite colour is green. And my favorite color: yellow.' const matches = regex.getMatch(testcase) assert.equal(matches[1], 'green') }) it('More Methods', () => { const regex = new SRL() .noWhitespace() .literally('a') .ifFollowedBy((builder) => { return builder.noCharacter() }) .tab() .mustEnd() .multiLine() const target = ` ba\t aaabbb ` assert.ok(regex.isMatching(target)) const regex2 = new SRL() .startsWith() .literally('a') .newLine() .whitespace() .onceOrMore() .literally('b') .mustEnd() const target2 = `a b` assert.ok(regex2.isMatching(target2)) }) it('Replace', () => { const regex = new SRL() .capture((query) => { query.anyCharacter().onceOrMore() }) .whitespace() .capture((query) => { query.digit().onceOrMore() }) .literally(', ') .capture((query) => { query.digit().onceOrMore() }) .caseInsensitive() .get() assert.equal('April 15, 2003'.replace(regex, '$1 1, $3'), 'April 1, 2003') }) it('Lazyness', () => { const regex = new SRL() .capture((query) => { query.literally(',').twice() .whitespace().optional() .lazy() }) const matches = regex.getMatch(',, ') assert.equal(matches[1], ',,') assert.notEqual(matches[1], ',, ') const regex2 = new SRL() .literally(',') .atLeast(1) .lazy() const matches2 = regex2.getMatch(',,,,,') assert.equal(matches2[0], ',') assert.notEqual(matches2[0], ',,,,,') }) it('Global as Default', () => { const regex = new SRL() .literally('a') .get() let count = 0 'aaa'.replace(regex, () => count++) assert.equal(count, 3) }) it('Raw', () => { const regex = new SRL() .literally('foo') .raw('b[a-z]r') .raw(/\d+/) assert.ok(regex.isMatching('foobzr123')) assert.ok(regex.isMatching('foobar1')) assert.ok(!regex.isMatching('fooa')) assert.ok(!regex.isMatching('foobar')) }) it('Remove modifier', () => { const regex = new SRL() .literally('foo') .removeModifier('g') .get() assert.deepEqual(regex, /(?:foo)/) }) })