diff --git a/README.md b/README.md index af89db6..b69db7e 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,27 @@ console.log(re.test('96')); //=> false ## Options +### options.antlr + +**Type**: `boolean` + +**Deafault**: `undefined` + +Enable generate regex to support antlr + +```js +var toRegexRange = require('to-regex-range'); +var source = toRegexRange('-128', '127', {capture: true, antlr: true}); +console.log("-128 -> 127 = "+source); + +-128 -> 127 = ('-'[1-9] +|'-''12'[0-8] +|'-'?[1-9][0-9] +|'-'?'1'[01][0-9] +|[0-9] +|'12'[0-7]) +``` + ### options.capture **Type**: `boolean` @@ -282,4 +303,4 @@ Released under the [MIT License](LICENSE). *** -_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.7.0, on July 25, 2018._ \ No newline at end of file +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.7.0, on July 25, 2018._ diff --git a/index.js b/index.js index 93fd219..ea76220 100644 --- a/index.js +++ b/index.js @@ -7,9 +7,16 @@ 'use strict'; -const isNumber = require('is-number'); +//const isNumber = require('is-number'); + +function isNumber(n){ + var re = new RegExp('^-?[0-9]+$'); + //console.log(n+'='+re.test(n)); + return re.test(n); +} function toRegexRange(min, max, options) { + toRegexRange.cache = {}; if (isNumber(min) === false) { throw new TypeError('toRegexRange: expected the first argument to be a number'); } @@ -75,14 +82,25 @@ function toRegexRange(min, max, options) { return tok.result; } -toRegexRange.cache = {}; - function siftPatterns(neg, pos, options) { - let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; - let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; - let intersected = filterPatterns(neg, pos, '-?', true, options) || []; + let onlyNegative; + let onlyPositive; + let intersected; + if (options.antlr){ + onlyNegative = filterPatterns(neg, pos, "'-'", false, options) || []; + onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + intersected = filterPatterns(neg, pos, "'-'?", true, options) || []; + }else{ + onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + intersected = filterPatterns(neg, pos, '-?', true, options) || []; + } let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); - return subpatterns.join('|'); + if (options.antlr){ + return subpatterns.join('\n|'); + }else{ + return subpatterns.join('|'); + } } function splitToRanges(min, max) { @@ -129,24 +147,51 @@ function rangeToPattern(start, stop, options) { let pattern = ''; let digits = 0; + var singleQuote=false; while (++i < len) { let numbers = zipped[i]; let startDigit = numbers[0]; let stopDigit = numbers[1]; - + //console.log("startDigit="+startDigit); if (startDigit === stopDigit) { + if (options.antlr) { + if (!singleQuote){ + pattern="'"; + singleQuote=true; + } + } pattern += startDigit; } else if (startDigit !== '0' || stopDigit !== '9') { + if (options.antlr) { + if (singleQuote){ + pattern+="'"; + singleQuote=false; + } + } pattern += toCharacterClass(startDigit, stopDigit); - } else { - digits += 1; + if (options.antlr){ + if (options.antlr) { + if (singleQuote){ + pattern+="'"; + singleQuote=false; + } + } + pattern += toCharacterClass(startDigit, stopDigit); + }else{ + digits += 1; + } } } if (digits) { + if (options.antlr) { + if (singleQuote){ + pattern+="'"; + } + } pattern += options.shorthand ? '\\d' : '[0-9]'; } @@ -208,11 +253,11 @@ function filterPatterns(arr, comparison, prefix, intersection, options) { } if (!intersection && !contains(comparison, 'string', ele)) { - res.push(prefix + ele); + res.push(prefix+ ele); } if (intersection && contains(comparison, 'string', ele)) { - res.push(prefix + ele); + res.push(prefix+ ele); } } return res; @@ -262,6 +307,7 @@ function toQuantifier(digits) { if (!stop && (!start || start === 1)) { return ''; } + //console.log("digits="+digits+' == '+'{' + start + stop + '}'); return '{' + start + stop + '}'; } diff --git a/peter-test.js b/peter-test.js new file mode 100644 index 0000000..a8af97e --- /dev/null +++ b/peter-test.js @@ -0,0 +1,4 @@ +const toRegexRange = require('./'); +var source = toRegexRange('-128', '127', {capture: true, antlr: true}); +console.log("-128 -> 127 = "+source); +