From 27a10d687f17262c9fc6d615ebfafc0acaf900c2 Mon Sep 17 00:00:00 2001 From: Peter Cheung Date: Sat, 5 Jan 2019 13:19:50 +0800 Subject: [PATCH 1/6] dev --- index.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 93fd219..203ba37 100644 --- a/index.js +++ b/index.js @@ -136,9 +136,15 @@ function rangeToPattern(start, stop, options) { let stopDigit = numbers[1]; if (startDigit === stopDigit) { +if (pattern==""){ + pattern="'"; +} pattern += startDigit; } else if (startDigit !== '0' || stopDigit !== '9') { +if (pattern!=""){ +pattern+="'"; +} pattern += toCharacterClass(startDigit, stopDigit); } else { @@ -208,11 +214,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; From ec39594c1c25fdcb0738bb481723e0bda0d8417b Mon Sep 17 00:00:00 2001 From: Peter Cheung Date: Sat, 5 Jan 2019 18:10:48 +0800 Subject: [PATCH 2/6] dev --- index.js | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/index.js b/index.js index 203ba37..3557063 100644 --- a/index.js +++ b/index.js @@ -10,6 +10,7 @@ const isNumber = require('is-number'); function toRegexRange(min, max, options) { + toRegexRange.cache = {}; if (isNumber(min) === false) { throw new TypeError('toRegexRange: expected the first argument to be a number'); } @@ -75,12 +76,19 @@ 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('|'); } @@ -136,15 +144,19 @@ function rangeToPattern(start, stop, options) { let stopDigit = numbers[1]; if (startDigit === stopDigit) { -if (pattern==""){ - pattern="'"; -} + if (options.antlr) { + if (pattern==""){ + pattern="'"; + } + } pattern += startDigit; } else if (startDigit !== '0' || stopDigit !== '9') { -if (pattern!=""){ -pattern+="'"; -} + if (options.antlr) { + if (pattern!=""){ + pattern+="'"; + } + } pattern += toCharacterClass(startDigit, stopDigit); } else { @@ -214,11 +226,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; From 315b7b19fdaaa1c63070b51e9b8112a826f93238 Mon Sep 17 00:00:00 2001 From: Peter Cheung Date: Sat, 5 Jan 2019 19:02:19 +0800 Subject: [PATCH 3/6] completed. added options.antlr to support antlr syntax --- index.js | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 3557063..ea76220 100644 --- a/index.js +++ b/index.js @@ -7,7 +7,13 @@ '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 = {}; @@ -90,7 +96,11 @@ function siftPatterns(neg, pos, 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) { @@ -137,34 +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 (pattern==""){ - pattern="'"; + if (!singleQuote){ + pattern="'"; + singleQuote=true; } } pattern += startDigit; } else if (startDigit !== '0' || stopDigit !== '9') { if (options.antlr) { - if (pattern!=""){ + 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]'; } @@ -280,6 +307,7 @@ function toQuantifier(digits) { if (!stop && (!start || start === 1)) { return ''; } + //console.log("digits="+digits+' == '+'{' + start + stop + '}'); return '{' + start + stop + '}'; } From 39af8228a3d981d47e16a002061dc62d0f96834c Mon Sep 17 00:00:00 2001 From: Peter Cheung Date: Sat, 5 Jan 2019 19:04:08 +0800 Subject: [PATCH 4/6] dev --- README.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af89db6..2a2288a 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,29 @@ 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.shorthand + ### options.capture **Type**: `boolean` @@ -282,4 +305,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._ From 0e4d9a1de16036b15df9db3e33be0f2f2553b61d Mon Sep 17 00:00:00 2001 From: Peter Cheung Date: Sat, 5 Jan 2019 19:05:11 +0800 Subject: [PATCH 5/6] dev --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 2a2288a..b69db7e 100644 --- a/README.md +++ b/README.md @@ -119,8 +119,6 @@ console.log("-128 -> 127 = "+source); |'12'[0-7]) ``` -### options.shorthand - ### options.capture **Type**: `boolean` From 5e429ae1f14e8d0c6a2ff3ec7ccfe7c595328256 Mon Sep 17 00:00:00 2001 From: Peter Cheung Date: Fri, 8 Feb 2019 00:45:15 +0800 Subject: [PATCH 6/6] dev --- peter-test.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 peter-test.js 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); +