浏览代码

add buildin regex support #798

Robin Herbots 8 年之前
父节点
当前提交
cf1f4a2be3
共有 48 个文件被更改,包括 479 次插入300 次删除
  1. 3 0
      CHANGELOG.md
  2. 1 1
      bower.json
  3. 1 1
      component.json
  4. 1 1
      composer.json
  5. 1 1
      dist/inputmask/bindings/inputmask.binding.js
  6. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js
  7. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js
  8. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.js
  9. 1 1
      dist/inputmask/global/document.js
  10. 1 1
      dist/inputmask/global/window.js
  11. 1 1
      dist/inputmask/inputmask.date.extensions.js
  12. 1 1
      dist/inputmask/inputmask.extensions.js
  13. 132 88
      dist/inputmask/inputmask.js
  14. 1 1
      dist/inputmask/inputmask.numeric.extensions.js
  15. 3 3
      dist/inputmask/inputmask.phone.extensions.js
  16. 1 1
      dist/inputmask/inputmask.regex.extensions.js
  17. 1 1
      dist/inputmask/jquery.inputmask.js
  18. 1 1
      dist/inputmask/phone-codes/phone-be.js
  19. 1 1
      dist/inputmask/phone-codes/phone-nl.js
  20. 1 1
      dist/inputmask/phone-codes/phone-ru.js
  21. 1 1
      dist/inputmask/phone-codes/phone-uk.js
  22. 1 1
      dist/inputmask/phone-codes/phone.js
  23. 134 90
      dist/jquery.inputmask.bundle.js
  24. 1 1
      dist/min/inputmask/bindings/inputmask.binding.min.js
  25. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.min.js
  26. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.min.js
  27. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.min.js
  28. 1 1
      dist/min/inputmask/global/document.min.js
  29. 1 1
      dist/min/inputmask/global/window.min.js
  30. 1 1
      dist/min/inputmask/inputmask.date.extensions.min.js
  31. 1 1
      dist/min/inputmask/inputmask.extensions.min.js
  32. 3 3
      dist/min/inputmask/inputmask.min.js
  33. 1 1
      dist/min/inputmask/inputmask.numeric.extensions.min.js
  34. 2 2
      dist/min/inputmask/inputmask.phone.extensions.min.js
  35. 1 1
      dist/min/inputmask/inputmask.regex.extensions.min.js
  36. 1 1
      dist/min/inputmask/jquery.inputmask.min.js
  37. 1 1
      dist/min/inputmask/phone-codes/phone-be.min.js
  38. 1 1
      dist/min/inputmask/phone-codes/phone-nl.min.js
  39. 1 1
      dist/min/inputmask/phone-codes/phone-ru.min.js
  40. 1 1
      dist/min/inputmask/phone-codes/phone-uk.min.js
  41. 1 1
      dist/min/inputmask/phone-codes/phone.min.js
  42. 4 4
      dist/min/jquery.inputmask.bundle.min.js
  43. 133 69
      js/inputmask.js
  44. 3 1
      js/inputmask.numeric.extensions.js
  45. 2 2
      js/inputmask.phone.extensions.js
  46. 1 1
      package.json
  47. 22 0
      qunit/tests_alternations.js
  48. 2 2
      qunit/tests_multi.js

+ 3 - 0
CHANGELOG.md

@@ -2,6 +2,9 @@
 All notable changes to this project will be documented in this file.
 
 ## [UNRELEASED]
+### Added
+- build-in regex support without extension
+
 ### Updates
 - make removing the inputmask take the autoUnmask option into account
 - enhance inputfallback event (android)

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "jquery.inputmask",
-  "version": "3.3.5-178",
+  "version": "3.3.5-209",
   "main": [
 	  "./dist/inputmask/inputmask.js",
 	  "./dist/inputmask/inputmask.extensions.js",

+ 1 - 1
component.json

@@ -2,7 +2,7 @@
 	"name": "jquery_inputmask",
 	"repository": "robinherbots/jquery.inputmask",
 	"description": "jquery.inputmask is a jquery plugin which create an input mask.",
-	"version": "3.3.5-178",
+	"version": "3.3.5-209",
 	"keywords": [
 		"jquery",
 		"plugins",

+ 1 - 1
composer.json

@@ -1,7 +1,7 @@
 {
   "name": "robinherbots/jquery.inputmask",
   "description": "jquery.inputmask is a jquery plugin which create an input mask.",
-  "version": "3.3.5-178",
+  "version": "3.3.5-209",
   "type": "library",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "homepage": "http://robinherbots.github.io/jquery.inputmask",

+ 1 - 1
dist/inputmask/bindings/inputmask.binding.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery", "../inputmask", "../global/document" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("../inputmask"), require("../global/document")) : factory(jQuery, window.Inputmask, document);

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jqlite", "../global/window", "../global/document]" ], factory) : "object" == typeof exports ? module.exports = factory(require("jqlite"), require("../global/window"), require("../global/document")) : window.dependencyLib = factory(jqlite, window, document);

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery")) : window.dependencyLib = factory(jQuery);

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../global/window", "../global/document" ], factory) : "object" == typeof exports ? module.exports = factory(require("../global/window"), require("../global/document")) : window.dependencyLib = factory(window, document);

+ 1 - 1
dist/inputmask/global/document.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 "function" == typeof define && define.amd ? define(function() {
     return document;

+ 1 - 1
dist/inputmask/global/window.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 "function" == typeof define && define.amd ? define(function() {
     return window;

+ 1 - 1
dist/inputmask/inputmask.date.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/inputmask.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 132 - 88
dist/inputmask/inputmask.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./global/window", "./global/document" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./global/window"), require("./global/document")) : window.Inputmask = factory(window.dependencyLib || jQuery, window, document);
@@ -22,7 +22,9 @@
     }
     function generateMaskSet(opts, nocache) {
         function generateMask(mask, metadata, opts) {
-            if (null !== mask && "" !== mask || (mask = "*{*}"), 1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), 
+            var regexMask = !1;
+            if (null !== mask && "" !== mask || (regexMask = null !== opts.regex, mask = opts.regex || "*{*}"), 
+            1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), 
             opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) {
                 var repeatStart = "*" === opts.repeat ? 0 : "+" === opts.repeat ? 1 : opts.repeat;
                 mask = opts.groupmarker.start + mask + opts.groupmarker.end + opts.quantifiermarker.start + repeatStart + "," + opts.repeat + opts.quantifiermarker.end;
@@ -30,7 +32,7 @@
             var masksetDefinition;
             return Inputmask.prototype.masksCache[mask] === undefined || nocache === !0 ? (masksetDefinition = {
                 mask: mask,
-                maskToken: Inputmask.prototype.analyseMask(mask, opts),
+                maskToken: Inputmask.prototype.analyseMask(mask, regexMask, opts),
                 validPositions: {},
                 _buffer: undefined,
                 buffer: undefined,
@@ -177,18 +179,30 @@
                                     }
                                     maltMatches = matches.slice(), testPos = currentPos, matches = [];
                                     for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) {
-                                        var altMatch = maltMatches[ndx1], hasMatch = !1;
+                                        var altMatch = maltMatches[ndx1], dropMatch = !1;
                                         altMatch.alternation = altMatch.alternation || loopNdxCnt;
                                         for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) {
                                             var altMatch2 = malternateMatches[ndx2];
-                                            if (("string" != typeof altIndex || $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) && (altMatch.match.def === altMatch2.match.def || staticCanMatchDefinition(altMatch, altMatch2))) {
-                                                hasMatch = altMatch.match.nativeDef === altMatch2.match.nativeDef, altMatch.alternation == altMatch2.alternation && altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], 
-                                                altMatch2.alternation = altMatch.alternation, null == altMatch.match.fn && (altMatch2.na = altMatch2.na || altMatch.locator[altMatch.alternation].toString(), 
-                                                altMatch2.na.indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.na = altMatch2.na + "," + altMatch.locator[altMatch.alternation])));
-                                                break;
+                                            if ("string" != typeof altIndex || $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) {
+                                                if (altMatch.match.nativeDef === altMatch2.match.nativeDef || altMatch.match.def === altMatch2.match.nativeDef || altMatch.match.nativeDef === altMatch2.match.def) {
+                                                    dropMatch = !0, altMatch.alternation == altMatch2.alternation && altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], 
+                                                    altMatch2.alternation = altMatch.alternation), altMatch.match.nativeDef === altMatch2.match.def && (altMatch.locator[altMatch.alternation] = altMatch2.locator[altMatch2.alternation], 
+                                                    malternateMatches.splice(malternateMatches.indexOf(altMatch2), 1, altMatch));
+                                                    break;
+                                                }
+                                                if (altMatch.match.def === altMatch2.match.def) {
+                                                    dropMatch = !1;
+                                                    break;
+                                                }
+                                                if (staticCanMatchDefinition(altMatch, altMatch2)) {
+                                                    dropMatch = altMatch.match.nativeDef === altMatch2.match.nativeDef, altMatch.alternation == altMatch2.alternation && altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], 
+                                                    altMatch2.alternation = altMatch.alternation, null == altMatch.match.fn && (altMatch2.na = altMatch2.na || altMatch.locator[altMatch.alternation].toString(), 
+                                                    altMatch2.na.indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.na = altMatch2.na + "," + altMatch.locator[altMatch.alternation])));
+                                                    break;
+                                                }
                                             }
                                         }
-                                        hasMatch || malternateMatches.push(altMatch);
+                                        dropMatch || malternateMatches.push(altMatch);
                                     }
                                 }
                                 "string" == typeof altIndex && (malternateMatches = $.map(malternateMatches, function(lmnt, ndx) {
@@ -1228,6 +1242,7 @@
             alternatormarker: "|",
             escapeChar: "\\",
             mask: null,
+            regex: null,
             oncomplete: $.noop,
             onincomplete: $.noop,
             oncleared: $.noop,
@@ -1391,7 +1406,7 @@
                 metadata: metadata
             });
         },
-        analyseMask: function(mask, opts) {
+        analyseMask: function(mask, regexMask, opts) {
             function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
                 this.matches = [], this.openGroup = isGroup || !1, this.isGroup = isGroup || !1, 
                 this.isOptional = isOptional || !1, this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, 
@@ -1401,47 +1416,65 @@
                 };
             }
             function insertTestDefinition(mtoken, element, position) {
-                var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element];
-                position = position !== undefined ? position : mtoken.matches.length;
-                var prevMatch = mtoken.matches[position - 1];
-                if (maskdef && !escaped) {
-                    for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
-                        var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
+                if (position = position !== undefined ? position : mtoken.matches.length, regexMask) 0 === element.indexOf("[") ? mtoken.matches.splice(position++, 0, {
+                    fn: new RegExp(element),
+                    cardinality: 0,
+                    optionality: mtoken.isOptional,
+                    newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+                    casing: null,
+                    def: opts.staticDefinitionSymbol || element,
+                    placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+                    nativeDef: element
+                }) : mtoken.matches.splice(position++, 0, {
+                    fn: null,
+                    cardinality: 0,
+                    optionality: mtoken.isOptional,
+                    newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+                    casing: null,
+                    def: opts.staticDefinitionSymbol || element,
+                    placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+                    nativeDef: element
+                }), escaped = !1; else {
+                    var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element], prevMatch = mtoken.matches[position - 1];
+                    if (maskdef && !escaped) {
+                        for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
+                            var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
+                            mtoken.matches.splice(position++, 0, {
+                                fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
+                                    this.test = validator;
+                                }() : new RegExp("."),
+                                cardinality: cardinality ? cardinality : 1,
+                                optionality: mtoken.isOptional,
+                                newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
+                                casing: maskdef.casing,
+                                def: maskdef.definitionSymbol || element,
+                                placeholder: maskdef.placeholder,
+                                nativeDef: element
+                            }), prevMatch = mtoken.matches[position - 1];
+                        }
                         mtoken.matches.splice(position++, 0, {
-                            fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
-                                this.test = validator;
+                            fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
+                                this.test = maskdef.validator;
                             }() : new RegExp("."),
-                            cardinality: cardinality ? cardinality : 1,
+                            cardinality: maskdef.cardinality,
                             optionality: mtoken.isOptional,
                             newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
                             casing: maskdef.casing,
                             def: maskdef.definitionSymbol || element,
                             placeholder: maskdef.placeholder,
                             nativeDef: element
-                        }), prevMatch = mtoken.matches[position - 1];
-                    }
-                    mtoken.matches.splice(position++, 0, {
-                        fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
-                            this.test = maskdef.validator;
-                        }() : new RegExp("."),
-                        cardinality: maskdef.cardinality,
+                        });
+                    } else mtoken.matches.splice(position++, 0, {
+                        fn: null,
+                        cardinality: 0,
                         optionality: mtoken.isOptional,
-                        newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
-                        casing: maskdef.casing,
-                        def: maskdef.definitionSymbol || element,
-                        placeholder: maskdef.placeholder,
+                        newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+                        casing: null,
+                        def: opts.staticDefinitionSymbol || element,
+                        placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
                         nativeDef: element
-                    });
-                } else mtoken.matches.splice(position++, 0, {
-                    fn: null,
-                    cardinality: 0,
-                    optionality: mtoken.isOptional,
-                    newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
-                    casing: null,
-                    def: opts.staticDefinitionSymbol || element,
-                    placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
-                    nativeDef: element
-                }), escaped = !1;
+                    }), escaped = !1;
+                }
             }
             function verifyGroupMarker(maskToken) {
                 maskToken && maskToken.matches && $.each(maskToken.matches, function(ndx, token) {
@@ -1478,58 +1511,69 @@
                 }
                 return maskToken;
             }
-            for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], 
-            escaped) defaultCase(); else switch (m.charAt(0)) {
-              case opts.escapeChar:
-                escaped = !0;
-                break;
+            var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, regexTokenizer = /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = [];
+            for (regexMask && (opts.optionalmarker.start = undefined, opts.optionalmarker.end = undefined); match = regexMask ? regexTokenizer.exec(mask) : tokenizer.exec(mask); ) {
+                if (m = match[0], regexMask) switch (m.charAt(0)) {
+                  case "?":
+                    m = "{+}";
+                    break;
 
-              case opts.optionalmarker.end:
-              case opts.groupmarker.end:
-                if (openingToken = openenings.pop(), openingToken.openGroup = !1, openingToken !== undefined) if (openenings.length > 0) {
-                    if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
-                    currentOpeningToken.isAlternator) {
-                        alternator = openenings.pop();
-                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
-                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
-                    }
-                } else currentToken.matches.push(openingToken); else defaultCase();
-                break;
+                  case "+":
+                  case "*":
+                    m = "{" + m + "}";
+                }
+                if (escaped) defaultCase(); else switch (m.charAt(0)) {
+                  case opts.escapeChar:
+                    escaped = !0;
+                    break;
 
-              case opts.optionalmarker.start:
-                openenings.push(new MaskToken((!1), (!0)));
-                break;
+                  case opts.optionalmarker.end:
+                  case opts.groupmarker.end:
+                    if (openingToken = openenings.pop(), openingToken.openGroup = !1, openingToken !== undefined) if (openenings.length > 0) {
+                        if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
+                        currentOpeningToken.isAlternator) {
+                            alternator = openenings.pop();
+                            for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
+                            openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                            currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
+                        }
+                    } else currentToken.matches.push(openingToken); else defaultCase();
+                    break;
 
-              case opts.groupmarker.start:
-                openenings.push(new MaskToken((!0)));
-                break;
+                  case opts.optionalmarker.start:
+                    openenings.push(new MaskToken((!1), (!0)));
+                    break;
 
-              case opts.quantifiermarker.start:
-                var quantifier = new MaskToken((!1), (!1), (!0));
-                m = m.replace(/[{}]/g, "");
-                var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
-                if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
-                    min: mq0,
-                    max: mq1
-                }, openenings.length > 0) {
-                    var matches = openenings[openenings.length - 1].matches;
-                    match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
-                    match = groupToken), matches.push(match), matches.push(quantifier);
-                } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
-                groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
-                currentToken.matches.push(quantifier);
-                break;
+                  case opts.groupmarker.start:
+                    openenings.push(new MaskToken((!0)));
+                    break;
 
-              case opts.alternatormarker:
-                openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
-                lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
-                alternator.matches.push(lastMatch), openenings.push(alternator));
-                break;
+                  case opts.quantifiermarker.start:
+                    var quantifier = new MaskToken((!1), (!1), (!0));
+                    m = m.replace(/[{}]/g, "");
+                    var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
+                    if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
+                        min: mq0,
+                        max: mq1
+                    }, openenings.length > 0) {
+                        var matches = openenings[openenings.length - 1].matches;
+                        match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
+                        match = groupToken), matches.push(match), matches.push(quantifier);
+                    } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
+                    groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
+                    currentToken.matches.push(quantifier);
+                    break;
 
-              default:
-                defaultCase();
+                  case opts.alternatormarker:
+                    openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                    lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
+                    lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
+                    alternator.matches.push(lastMatch), openenings.push(alternator));
+                    break;
+
+                  default:
+                    defaultCase();
+                }
             }
             for (;openenings.length > 0; ) openingToken = openenings.pop(), currentToken.matches.push(openingToken);
             return currentToken.matches.length > 0 && (verifyGroupMarker(currentToken), maskTokens.push(currentToken)), 

+ 1 - 1
dist/inputmask/inputmask.numeric.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 3 - 3
dist/inputmask/inputmask.phone.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);
@@ -13,7 +13,7 @@
         return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb);
     }
     var analyseMaskBase = Inputmask.prototype.analyseMask;
-    return Inputmask.prototype.analyseMask = function(mask, opts) {
+    return Inputmask.prototype.analyseMask = function(mask, regexMask, opts) {
         function reduceVariations(masks, previousVariation, previousmaskGroup) {
             previousVariation = previousVariation || "", previousmaskGroup = previousmaskGroup || maskGroups, 
             "" !== previousVariation && (previousmaskGroup[previousVariation] = {});
@@ -31,7 +31,7 @@
         opts.phoneCodes && (opts.phoneCodes && opts.phoneCodes.length > 1e3 && (mask = mask.substr(1, mask.length - 2), 
         reduceVariations(mask.split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start)), 
         mask = rebuild(maskGroups)), mask = mask.replace(/9/g, "\\9"));
-        var mt = analyseMaskBase.call(this, mask, opts);
+        var mt = analyseMaskBase.call(this, mask, regexMask, opts);
         return mt;
     }, Inputmask.extendAliases({
         abstractphone: {

+ 1 - 1
dist/inputmask/inputmask.regex.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/jquery.inputmask.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-be.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-nl.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-ru.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-uk.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 134 - 90
dist/jquery.inputmask.bundle.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(factory) {
     window.Inputmask = factory(window.dependencyLib || jQuery, window, document);
@@ -22,7 +22,9 @@
     }
     function generateMaskSet(opts, nocache) {
         function generateMask(mask, metadata, opts) {
-            if (null !== mask && "" !== mask || (mask = "*{*}"), 1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), 
+            var regexMask = !1;
+            if (null !== mask && "" !== mask || (regexMask = null !== opts.regex, mask = opts.regex || "*{*}"), 
+            1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), 
             opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) {
                 var repeatStart = "*" === opts.repeat ? 0 : "+" === opts.repeat ? 1 : opts.repeat;
                 mask = opts.groupmarker.start + mask + opts.groupmarker.end + opts.quantifiermarker.start + repeatStart + "," + opts.repeat + opts.quantifiermarker.end;
@@ -30,7 +32,7 @@
             var masksetDefinition;
             return Inputmask.prototype.masksCache[mask] === undefined || nocache === !0 ? (masksetDefinition = {
                 mask: mask,
-                maskToken: Inputmask.prototype.analyseMask(mask, opts),
+                maskToken: Inputmask.prototype.analyseMask(mask, regexMask, opts),
                 validPositions: {},
                 _buffer: undefined,
                 buffer: undefined,
@@ -177,18 +179,30 @@
                                     }
                                     maltMatches = matches.slice(), testPos = currentPos, matches = [];
                                     for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) {
-                                        var altMatch = maltMatches[ndx1], hasMatch = !1;
+                                        var altMatch = maltMatches[ndx1], dropMatch = !1;
                                         altMatch.alternation = altMatch.alternation || loopNdxCnt;
                                         for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) {
                                             var altMatch2 = malternateMatches[ndx2];
-                                            if (("string" != typeof altIndex || $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) && (altMatch.match.def === altMatch2.match.def || staticCanMatchDefinition(altMatch, altMatch2))) {
-                                                hasMatch = altMatch.match.nativeDef === altMatch2.match.nativeDef, altMatch.alternation == altMatch2.alternation && altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], 
-                                                altMatch2.alternation = altMatch.alternation, null == altMatch.match.fn && (altMatch2.na = altMatch2.na || altMatch.locator[altMatch.alternation].toString(), 
-                                                altMatch2.na.indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.na = altMatch2.na + "," + altMatch.locator[altMatch.alternation])));
-                                                break;
+                                            if ("string" != typeof altIndex || $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) {
+                                                if (altMatch.match.nativeDef === altMatch2.match.nativeDef || altMatch.match.def === altMatch2.match.nativeDef || altMatch.match.nativeDef === altMatch2.match.def) {
+                                                    dropMatch = !0, altMatch.alternation == altMatch2.alternation && altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], 
+                                                    altMatch2.alternation = altMatch.alternation), altMatch.match.nativeDef === altMatch2.match.def && (altMatch.locator[altMatch.alternation] = altMatch2.locator[altMatch2.alternation], 
+                                                    malternateMatches.splice(malternateMatches.indexOf(altMatch2), 1, altMatch));
+                                                    break;
+                                                }
+                                                if (altMatch.match.def === altMatch2.match.def) {
+                                                    dropMatch = !1;
+                                                    break;
+                                                }
+                                                if (staticCanMatchDefinition(altMatch, altMatch2)) {
+                                                    dropMatch = altMatch.match.nativeDef === altMatch2.match.nativeDef, altMatch.alternation == altMatch2.alternation && altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], 
+                                                    altMatch2.alternation = altMatch.alternation, null == altMatch.match.fn && (altMatch2.na = altMatch2.na || altMatch.locator[altMatch.alternation].toString(), 
+                                                    altMatch2.na.indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.na = altMatch2.na + "," + altMatch.locator[altMatch.alternation])));
+                                                    break;
+                                                }
                                             }
                                         }
-                                        hasMatch || malternateMatches.push(altMatch);
+                                        dropMatch || malternateMatches.push(altMatch);
                                     }
                                 }
                                 "string" == typeof altIndex && (malternateMatches = $.map(malternateMatches, function(lmnt, ndx) {
@@ -1228,6 +1242,7 @@
             alternatormarker: "|",
             escapeChar: "\\",
             mask: null,
+            regex: null,
             oncomplete: $.noop,
             onincomplete: $.noop,
             oncleared: $.noop,
@@ -1391,7 +1406,7 @@
                 metadata: metadata
             });
         },
-        analyseMask: function(mask, opts) {
+        analyseMask: function(mask, regexMask, opts) {
             function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
                 this.matches = [], this.openGroup = isGroup || !1, this.isGroup = isGroup || !1, 
                 this.isOptional = isOptional || !1, this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, 
@@ -1401,47 +1416,65 @@
                 };
             }
             function insertTestDefinition(mtoken, element, position) {
-                var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element];
-                position = position !== undefined ? position : mtoken.matches.length;
-                var prevMatch = mtoken.matches[position - 1];
-                if (maskdef && !escaped) {
-                    for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
-                        var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
+                if (position = position !== undefined ? position : mtoken.matches.length, regexMask) 0 === element.indexOf("[") ? mtoken.matches.splice(position++, 0, {
+                    fn: new RegExp(element),
+                    cardinality: 0,
+                    optionality: mtoken.isOptional,
+                    newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+                    casing: null,
+                    def: opts.staticDefinitionSymbol || element,
+                    placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+                    nativeDef: element
+                }) : mtoken.matches.splice(position++, 0, {
+                    fn: null,
+                    cardinality: 0,
+                    optionality: mtoken.isOptional,
+                    newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+                    casing: null,
+                    def: opts.staticDefinitionSymbol || element,
+                    placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+                    nativeDef: element
+                }), escaped = !1; else {
+                    var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element], prevMatch = mtoken.matches[position - 1];
+                    if (maskdef && !escaped) {
+                        for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
+                            var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
+                            mtoken.matches.splice(position++, 0, {
+                                fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
+                                    this.test = validator;
+                                }() : new RegExp("."),
+                                cardinality: cardinality ? cardinality : 1,
+                                optionality: mtoken.isOptional,
+                                newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
+                                casing: maskdef.casing,
+                                def: maskdef.definitionSymbol || element,
+                                placeholder: maskdef.placeholder,
+                                nativeDef: element
+                            }), prevMatch = mtoken.matches[position - 1];
+                        }
                         mtoken.matches.splice(position++, 0, {
-                            fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
-                                this.test = validator;
+                            fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
+                                this.test = maskdef.validator;
                             }() : new RegExp("."),
-                            cardinality: cardinality ? cardinality : 1,
+                            cardinality: maskdef.cardinality,
                             optionality: mtoken.isOptional,
                             newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
                             casing: maskdef.casing,
                             def: maskdef.definitionSymbol || element,
                             placeholder: maskdef.placeholder,
                             nativeDef: element
-                        }), prevMatch = mtoken.matches[position - 1];
-                    }
-                    mtoken.matches.splice(position++, 0, {
-                        fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
-                            this.test = maskdef.validator;
-                        }() : new RegExp("."),
-                        cardinality: maskdef.cardinality,
+                        });
+                    } else mtoken.matches.splice(position++, 0, {
+                        fn: null,
+                        cardinality: 0,
                         optionality: mtoken.isOptional,
-                        newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
-                        casing: maskdef.casing,
-                        def: maskdef.definitionSymbol || element,
-                        placeholder: maskdef.placeholder,
+                        newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+                        casing: null,
+                        def: opts.staticDefinitionSymbol || element,
+                        placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
                         nativeDef: element
-                    });
-                } else mtoken.matches.splice(position++, 0, {
-                    fn: null,
-                    cardinality: 0,
-                    optionality: mtoken.isOptional,
-                    newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
-                    casing: null,
-                    def: opts.staticDefinitionSymbol || element,
-                    placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
-                    nativeDef: element
-                }), escaped = !1;
+                    }), escaped = !1;
+                }
             }
             function verifyGroupMarker(maskToken) {
                 maskToken && maskToken.matches && $.each(maskToken.matches, function(ndx, token) {
@@ -1478,58 +1511,69 @@
                 }
                 return maskToken;
             }
-            for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], 
-            escaped) defaultCase(); else switch (m.charAt(0)) {
-              case opts.escapeChar:
-                escaped = !0;
-                break;
+            var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, regexTokenizer = /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = [];
+            for (regexMask && (opts.optionalmarker.start = undefined, opts.optionalmarker.end = undefined); match = regexMask ? regexTokenizer.exec(mask) : tokenizer.exec(mask); ) {
+                if (m = match[0], regexMask) switch (m.charAt(0)) {
+                  case "?":
+                    m = "{+}";
+                    break;
 
-              case opts.optionalmarker.end:
-              case opts.groupmarker.end:
-                if (openingToken = openenings.pop(), openingToken.openGroup = !1, openingToken !== undefined) if (openenings.length > 0) {
-                    if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
-                    currentOpeningToken.isAlternator) {
-                        alternator = openenings.pop();
-                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
-                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
-                    }
-                } else currentToken.matches.push(openingToken); else defaultCase();
-                break;
+                  case "+":
+                  case "*":
+                    m = "{" + m + "}";
+                }
+                if (escaped) defaultCase(); else switch (m.charAt(0)) {
+                  case opts.escapeChar:
+                    escaped = !0;
+                    break;
 
-              case opts.optionalmarker.start:
-                openenings.push(new MaskToken((!1), (!0)));
-                break;
+                  case opts.optionalmarker.end:
+                  case opts.groupmarker.end:
+                    if (openingToken = openenings.pop(), openingToken.openGroup = !1, openingToken !== undefined) if (openenings.length > 0) {
+                        if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
+                        currentOpeningToken.isAlternator) {
+                            alternator = openenings.pop();
+                            for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
+                            openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                            currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
+                        }
+                    } else currentToken.matches.push(openingToken); else defaultCase();
+                    break;
 
-              case opts.groupmarker.start:
-                openenings.push(new MaskToken((!0)));
-                break;
+                  case opts.optionalmarker.start:
+                    openenings.push(new MaskToken((!1), (!0)));
+                    break;
 
-              case opts.quantifiermarker.start:
-                var quantifier = new MaskToken((!1), (!1), (!0));
-                m = m.replace(/[{}]/g, "");
-                var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
-                if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
-                    min: mq0,
-                    max: mq1
-                }, openenings.length > 0) {
-                    var matches = openenings[openenings.length - 1].matches;
-                    match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
-                    match = groupToken), matches.push(match), matches.push(quantifier);
-                } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
-                groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
-                currentToken.matches.push(quantifier);
-                break;
+                  case opts.groupmarker.start:
+                    openenings.push(new MaskToken((!0)));
+                    break;
 
-              case opts.alternatormarker:
-                openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
-                lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
-                alternator.matches.push(lastMatch), openenings.push(alternator));
-                break;
+                  case opts.quantifiermarker.start:
+                    var quantifier = new MaskToken((!1), (!1), (!0));
+                    m = m.replace(/[{}]/g, "");
+                    var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
+                    if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
+                        min: mq0,
+                        max: mq1
+                    }, openenings.length > 0) {
+                        var matches = openenings[openenings.length - 1].matches;
+                        match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
+                        match = groupToken), matches.push(match), matches.push(quantifier);
+                    } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
+                    groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
+                    currentToken.matches.push(quantifier);
+                    break;
 
-              default:
-                defaultCase();
+                  case opts.alternatormarker:
+                    openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                    lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
+                    lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
+                    alternator.matches.push(lastMatch), openenings.push(alternator));
+                    break;
+
+                  default:
+                    defaultCase();
+                }
             }
             for (;openenings.length > 0; ) openingToken = openenings.pop(), currentToken.matches.push(openingToken);
             return currentToken.matches.length > 0 && (verifyGroupMarker(currentToken), maskTokens.push(currentToken)), 
@@ -2538,7 +2582,7 @@
         return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb);
     }
     var analyseMaskBase = Inputmask.prototype.analyseMask;
-    return Inputmask.prototype.analyseMask = function(mask, opts) {
+    return Inputmask.prototype.analyseMask = function(mask, regexMask, opts) {
         function reduceVariations(masks, previousVariation, previousmaskGroup) {
             previousVariation = previousVariation || "", previousmaskGroup = previousmaskGroup || maskGroups, 
             "" !== previousVariation && (previousmaskGroup[previousVariation] = {});
@@ -2556,7 +2600,7 @@
         opts.phoneCodes && (opts.phoneCodes && opts.phoneCodes.length > 1e3 && (mask = mask.substr(1, mask.length - 2), 
         reduceVariations(mask.split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start)), 
         mask = rebuild(maskGroups)), mask = mask.replace(/9/g, "\\9"));
-        var mt = analyseMaskBase.call(this, mask, opts);
+        var mt = analyseMaskBase.call(this, mask, regexMask, opts);
         return mt;
     }, Inputmask.extendAliases({
         abstractphone: {

文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/bindings/inputmask.binding.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.min.js


+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.min.js

@@ -3,6 +3,6 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):window.dependencyLib=a(jQuery)}(function(a){return a});

文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.min.js


+ 1 - 1
dist/min/inputmask/global/document.min.js

@@ -3,6 +3,6 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 "function"==typeof define&&define.amd?define(function(){return document}):"object"==typeof exports&&(module.exports=document);

+ 1 - 1
dist/min/inputmask/global/window.min.js

@@ -3,6 +3,6 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-178
+* Version: 3.3.5-209
 */
 "function"==typeof define&&define.amd?define(function(){return window}):"object"==typeof exports&&(module.exports=window);

文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.date.extensions.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.extensions.min.js


文件差异内容过多而无法显示
+ 3 - 3
dist/min/inputmask/inputmask.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.numeric.extensions.min.js


文件差异内容过多而无法显示
+ 2 - 2
dist/min/inputmask/inputmask.phone.extensions.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.regex.extensions.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/jquery.inputmask.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/phone-codes/phone-be.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/phone-codes/phone-nl.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/phone-codes/phone-ru.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/phone-codes/phone-uk.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/phone-codes/phone.min.js


文件差异内容过多而无法显示
+ 4 - 4
dist/min/jquery.inputmask.bundle.min.js


+ 133 - 69
js/inputmask.js

@@ -68,6 +68,7 @@
 			alternatormarker: "|",
 			escapeChar: "\\",
 			mask: null, //needs tobe null instead of undefined as the extend method does not consider props with the undefined value
+			regex: null, //regular expression as a mask
 			oncomplete: $.noop, //executes when the mask is complete
 			onincomplete: $.noop, //executes when the mask is incomplete and focus is lost
 			oncleared: $.noop, //executes when the mask is cleared
@@ -286,8 +287,10 @@
 				"metadata": metadata //true/false getmetadata
 			});
 		},
-		analyseMask: function (mask, opts) {
+		analyseMask: function (mask, regexMask, opts) {
 			var tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g,
+				//Thx to https://github.com/slevithan/regex-colorizer for the regexTokenizer regex
+				regexTokenizer = /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g,
 				escaped = false,
 				currentToken = new MaskToken(),
 				match,
@@ -315,22 +318,62 @@
 
 			//test definition => {fn: RegExp/function, cardinality: int, optionality: bool, newBlockMarker: bool, casing: null/upper/lower, def: definitionSymbol, placeholder: placeholder, mask: real maskDefinition}
 			function insertTestDefinition(mtoken, element, position) {
-				var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element];
 				position = position !== undefined ? position : mtoken.matches.length;
-				var prevMatch = mtoken.matches[position - 1];
-				if (maskdef && !escaped) {
-					var prevalidators = maskdef.prevalidator,
-						prevalidatorsL = prevalidators ? prevalidators.length : 0;
-					//handle prevalidators
-					for (var i = 1; i < maskdef.cardinality; i++) {
-						var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [],
-							validator = prevalidator.validator,
-							cardinality = prevalidator.cardinality;
+				if (regexMask) {
+					if (element.indexOf("[") === 0) {
 						mtoken.matches.splice(position++, 0, {
-							fn: validator ? typeof validator === "string" ? new RegExp(validator) : new function () {
-										this.test = validator;
-									} : new RegExp("."),
-							cardinality: cardinality ? cardinality : 1,
+							fn: new RegExp(element),
+							cardinality: 0,
+							optionality: mtoken.isOptional,
+							newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+							casing: null,
+							def: opts.staticDefinitionSymbol || element,
+							placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+							nativeDef: element
+						});
+					} else {
+						mtoken.matches.splice(position++, 0, {
+							fn: null,
+							cardinality: 0,
+							optionality: mtoken.isOptional,
+							newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+							casing: null,
+							def: opts.staticDefinitionSymbol || element,
+							placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+							nativeDef: element
+						});
+					}
+					escaped = false;
+				} else {
+					var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element];
+					var prevMatch = mtoken.matches[position - 1];
+					if (maskdef && !escaped) {
+						var prevalidators = maskdef.prevalidator,
+							prevalidatorsL = prevalidators ? prevalidators.length : 0;
+						//handle prevalidators
+						for (var i = 1; i < maskdef.cardinality; i++) {
+							var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [],
+								validator = prevalidator.validator,
+								cardinality = prevalidator.cardinality;
+							mtoken.matches.splice(position++, 0, {
+								fn: validator ? typeof validator === "string" ? new RegExp(validator) : new function () {
+									this.test = validator;
+								} : new RegExp("."),
+								cardinality: cardinality ? cardinality : 1,
+								optionality: mtoken.isOptional,
+								newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
+								casing: maskdef.casing,
+								def: maskdef.definitionSymbol || element,
+								placeholder: maskdef.placeholder,
+								nativeDef: element
+							});
+							prevMatch = mtoken.matches[position - 1];
+						}
+						mtoken.matches.splice(position++, 0, {
+							fn: maskdef.validator ? typeof maskdef.validator == "string" ? new RegExp(maskdef.validator) : new function () {
+								this.test = maskdef.validator;
+							} : new RegExp("."),
+							cardinality: maskdef.cardinality,
 							optionality: mtoken.isOptional,
 							newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
 							casing: maskdef.casing,
@@ -338,32 +381,19 @@
 							placeholder: maskdef.placeholder,
 							nativeDef: element
 						});
-						prevMatch = mtoken.matches[position - 1];
+					} else {
+						mtoken.matches.splice(position++, 0, {
+							fn: null,
+							cardinality: 0,
+							optionality: mtoken.isOptional,
+							newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+							casing: null,
+							def: opts.staticDefinitionSymbol || element,
+							placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+							nativeDef: element
+						});
+						escaped = false;
 					}
-					mtoken.matches.splice(position++, 0, {
-						fn: maskdef.validator ? typeof maskdef.validator == "string" ? new RegExp(maskdef.validator) : new function () {
-									this.test = maskdef.validator;
-								} : new RegExp("."),
-						cardinality: maskdef.cardinality,
-						optionality: mtoken.isOptional,
-						newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
-						casing: maskdef.casing,
-						def: maskdef.definitionSymbol || element,
-						placeholder: maskdef.placeholder,
-						nativeDef: element
-					});
-				} else {
-					mtoken.matches.splice(position++, 0, {
-						fn: null,
-						cardinality: 0,
-						optionality: mtoken.isOptional,
-						newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
-						casing: null,
-						def: opts.staticDefinitionSymbol || element,
-						placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
-						nativeDef: element
-					});
-					escaped = false;
 				}
 			}
 
@@ -435,9 +465,27 @@
 				return maskToken;
 			}
 
-			while (match = tokenizer.exec(mask)) {
+
+			if (regexMask) {
+				opts.optionalmarker.start = undefined;
+				opts.optionalmarker.end = undefined;
+			}
+			while (match = regexMask ? regexTokenizer.exec(mask) : tokenizer.exec(mask)) {
 				m = match[0];
 
+				if (regexMask) {
+					switch (m.charAt(0)) {
+						//Quantifier
+						case "?":
+							m = "{+}";
+							break;
+						case "+":
+						case "*":
+							m = "{" + m + "}";
+							break;
+					}
+				}
+
 				if (escaped) {
 					defaultCase();
 					continue;
@@ -517,8 +565,7 @@
 							currentToken.matches.push(quantifier);
 						}
 						break;
-					case
-					opts.alternatormarker:
+					case opts.alternatormarker:
 						if (openenings.length > 0) {
 							currentOpeningToken = openenings[openenings.length - 1];
 							lastMatch = currentOpeningToken.matches.pop();
@@ -638,8 +685,10 @@
 
 	function generateMaskSet(opts, nocache) {
 		function generateMask(mask, metadata, opts) {
+			var regexMask = false;
 			if (mask === null || mask === "") {
-				mask = "*{*}";
+				regexMask = opts.regex !== null;
+				mask = opts.regex || "*{*}";
 			}
 			if (mask.length === 1 && opts.greedy === false && opts.repeat !== 0) {
 				opts.placeholder = "";
@@ -654,7 +703,7 @@
 			if (Inputmask.prototype.masksCache[mask] === undefined || nocache === true) {
 				masksetDefinition = {
 					"mask": mask,
-					"maskToken": Inputmask.prototype.analyseMask(mask, opts),
+					"maskToken": Inputmask.prototype.analyseMask(mask, regexMask, opts),
 					"validPositions": {},
 					"_buffer": undefined,
 					"buffer": undefined,
@@ -999,17 +1048,30 @@
 
 									//fuzzy merge matches
 									for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) {
-										var altMatch = maltMatches[ndx1], hasMatch = false;
+										var altMatch = maltMatches[ndx1], dropMatch = false;
 										altMatch.alternation = altMatch.alternation || loopNdxCnt;
 										for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) {
 											var altMatch2 = malternateMatches[ndx2];
 											//verify equality
 											if (typeof altIndex !== "string" || $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1) {
-												if (altMatch.match.def === altMatch2.match.def || staticCanMatchDefinition(altMatch, altMatch2)) {
-													hasMatch = altMatch.match.nativeDef === altMatch2.match.nativeDef;
-													// if (altMatch.alternation != altMatch2.alternation) {
-													// 	console.log("alternation mismatch");
-													// }
+												if (altMatch.match.nativeDef === altMatch2.match.nativeDef || altMatch.match.def === altMatch2.match.nativeDef || altMatch.match.nativeDef === altMatch2.match.def) {
+													dropMatch = true;
+													if (altMatch.alternation == altMatch2.alternation &&
+														altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1) {
+														altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation];
+														altMatch2.alternation = altMatch.alternation; //we pass the alternation index => used in determineLastRequiredPosition
+													}
+													if (altMatch.match.nativeDef === altMatch2.match.def) {
+														altMatch.locator[altMatch.alternation] = altMatch2.locator[altMatch2.alternation];
+														malternateMatches.splice(malternateMatches.indexOf(altMatch2), 1, altMatch);
+													}
+													break;
+												} else if (altMatch.match.def === altMatch2.match.def) {
+													dropMatch = false;
+													break;
+												} else if (staticCanMatchDefinition(altMatch, altMatch2)) {
+													// console.log("case 5");
+													dropMatch = altMatch.match.nativeDef === altMatch2.match.nativeDef;
 													if (altMatch.alternation == altMatch2.alternation && //can we merge if the alternation is different??  TODO TOCHECK INVESTIGATE
 														altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1) {
 														altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation];
@@ -1024,7 +1086,7 @@
 												}
 											}
 										}
-										if (!hasMatch) {
+										if (!dropMatch) {
 											malternateMatches.push(altMatch);
 										}
 									}
@@ -1410,7 +1472,8 @@
 					if (decisionTaker.length > 0) { //no decision taken ~ take first one as decider
 						decisionTaker = decisionTaker.split(",")[0];
 					}
-					var possibilityPos = getMaskSet().validPositions[decisionPos], prevPos = getMaskSet().validPositions[decisionPos - 1];
+					var possibilityPos = getMaskSet().validPositions[decisionPos],
+						prevPos = getMaskSet().validPositions[decisionPos - 1];
 					$.each(getTests(decisionPos, prevPos ? prevPos.locator : undefined, decisionPos - 1), function (ndx, test) {
 						altNdxs = test.locator[alternation] ? test.locator[alternation].toString().split(",") : [];
 						for (var mndx = 0; mndx < altNdxs.length; mndx++) {
@@ -1961,9 +2024,9 @@
 				} else break;
 			}
 			return returnDefinition ? {
-					"l": bl,
-					"def": positions[bl] ? positions[bl].match : undefined
-				} : bl;
+				"l": bl,
+				"def": positions[bl] ? positions[bl].match : undefined
+			} : bl;
 		}
 
 		function clearOptionalTail(buffer) {
@@ -2006,7 +2069,8 @@
 			function generalize() {
 				if (opts.keepStatic) {
 					var validInputs = [],
-						lastAlt = getLastValidPosition(-1, true), positionsClone = $.extend(true, {}, getMaskSet().validPositions),
+						lastAlt = getLastValidPosition(-1, true),
+						positionsClone = $.extend(true, {}, getMaskSet().validPositions),
 						prevAltPos = getMaskSet().validPositions[lastAlt];
 					//find last alternation
 					for (; lastAlt >= 0; lastAlt--) {
@@ -2251,9 +2315,9 @@
 						//special treat the decimal separator
 						if (k === 46 && e.shiftKey === false && opts.radixPoint !== "") k = opts.radixPoint.charCodeAt(0);
 						var pos = checkval ? {
-									begin: ndx,
-									end: ndx
-								} : caret(input),
+								begin: ndx,
+								end: ndx
+							} : caret(input),
 							forwardPosition, c = String.fromCharCode(k);
 
 						getMaskSet().writeOutBuffer = true;
@@ -2784,12 +2848,12 @@
 					function patchValhook(type) {
 						if ($.valHooks && ($.valHooks[type] === undefined || $.valHooks[type].inputmaskpatch !== true)) {
 							var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function (elem) {
-									return elem.value;
-								};
+								return elem.value;
+							};
 							var valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function (elem, value) {
-									elem.value = value;
-									return elem;
-								};
+								elem.value = value;
+								return elem;
+							};
 
 							$.valHooks[type] = {
 								get: function (elem) {
@@ -2851,10 +2915,10 @@
 							if (Object.getOwnPropertyDescriptor) {
 								if (typeof Object.getPrototypeOf !== "function") {
 									Object.getPrototypeOf = typeof "test".__proto__ === "object" ? function (object) {
-											return object.__proto__;
-										} : function (object) {
-											return object.constructor.prototype;
-										};
+										return object.__proto__;
+									} : function (object) {
+										return object.constructor.prototype;
+									};
 								}
 
 								var valueProperty = Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(npt), "value") : undefined;

+ 3 - 1
js/inputmask.numeric.extensions.js

@@ -223,7 +223,9 @@
 					processValue = processValue.replace(/^0/g, "");
 				}
 
-				if (processValue.charAt(0) === opts.radixPoint && opts.numericInput !== true) processValue = "0" + processValue;
+				if (processValue.charAt(0) === opts.radixPoint && opts.numericInput !== true) {
+					processValue = "0" + processValue;
+				}
 
 				if (processValue !== "") {
 					processValue = processValue.split("");

+ 2 - 2
js/inputmask.phone.extensions.js

@@ -29,7 +29,7 @@
 
 	var analyseMaskBase = Inputmask.prototype.analyseMask;
 
-	Inputmask.prototype.analyseMask = function (mask, opts) {
+	Inputmask.prototype.analyseMask = function (mask, regexMask, opts) {
 		var maskGroups = {};
 
 		function reduceVariations(masks, previousVariation, previousmaskGroup) {
@@ -84,7 +84,7 @@
 			mask = mask.replace(/9/g, "\\9");
 		}
 		// console.log(mask);
-		var mt = analyseMaskBase.call(this, mask, opts);
+		var mt = analyseMaskBase.call(this, mask, regexMask,opts);
 		return mt;
 	};
 	Inputmask.extendAliases({

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "jquery.inputmask",
-	"version": "3.3.5-178",
+	"version": "3.3.5-209",
 	"description": "jquery.inputmask is a jquery plugin which create an input mask.",
 	"main": "dist/jquery.inputmask.bundle.js",
 	"files": [

+ 22 - 0
qunit/tests_alternations.js

@@ -202,4 +202,26 @@ define([
 		$("#testmask").Type("412123123");
 		assert.equal(testmask.inputmask._valueGet(), "+374-12-123-123", "Result " + testmask.inputmask._valueGet());
 	});
+
+	qunit.test("(9)|(a9) - type 1 - ivaninDarpatov", function (assert) {
+		var $fixture = $("#qunit-fixture");
+		$fixture.append('<input type="text" id="testmask" />');
+		var testmask = document.getElementById("testmask");
+
+		Inputmask("(9)|(a9)").mask(testmask);
+		testmask.focus();
+		$("#testmask").Type("12");
+		assert.equal(testmask.inputmask._valueGet(), "1", "Result " + testmask.inputmask._valueGet());
+	});
+
+	qunit.test("(9)|(a9) - type a1 - ivaninDarpatov", function (assert) {
+		var $fixture = $("#qunit-fixture");
+		$fixture.append('<input type="text" id="testmask" />');
+		var testmask = document.getElementById("testmask");
+
+		Inputmask("(9)|(a9)").mask(testmask);
+		testmask.focus();
+		$("#testmask").Type("a1");
+		assert.equal(testmask.inputmask._valueGet(), "a1", "Result " + testmask.inputmask._valueGet());
+	});
 });

+ 2 - 2
qunit/tests_multi.js

@@ -362,9 +362,9 @@ define([
 		var $fixture = $("#qunit-fixture");
 		$fixture.append('<input type="text" id="testmask" />');
 		var testmask = document.getElementById("testmask");
-		Inputmask("(99 99 999999)|(i{+})", {
+		Inputmask("(99 99 999999)|(*{+})", {
 			definitions: {
-				"i": {
+				"*": {
 					validator: ".",
 					cardinality: 1,
 					definitionSymbol: "*"