2 * expand-brackets <https://github.com/jonschlinkert/expand-brackets>
4 * Copyright (c) 2015 Jon Schlinkert.
5 * Licensed under the MIT license.
10 var isPosixBracket = require('is-posix-bracket');
13 * POSIX character classes
20 cntrl: '\\x00-\\x1F\\x7F',
25 punct: '-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~',
26 space: ' \\t\\r\\n\\v\\f',
36 module.exports = brackets;
38 function brackets(str) {
39 if (!isPosixBracket(str)) {
44 if (str.indexOf('[^') !== -1) {
46 str = str.split('[^').join('[');
48 if (str.indexOf('[!') !== -1) {
50 str = str.split('[!').join('[');
53 var a = str.split('[');
54 var b = str.split(']');
55 var imbalanced = a.length !== b.length;
57 var parts = str.split(/(?::\]\[:|\[?\[:|:\]\]?)/);
58 var len = parts.length, i = 0;
59 var end = '', beg = '';
62 // start at the end (innermost) first
64 var inner = parts[i++];
65 if (inner === '^[!' || inner === '[!') {
70 var prefix = negated ? '^' : '';
71 var ch = POSIX[inner];
74 res.push('[' + prefix + ch + ']');
76 if (/^\[?\w-\w\]?$/.test(inner)) {
77 if (i === parts.length) {
78 res.push('[' + prefix + inner);
80 res.push(prefix + inner + ']');
82 res.push(prefix + inner);
87 } else if (i === parts.length) {
90 res.push('[' + prefix + inner + ']');
96 var result = res.join('|');
97 var rlen = res.length || 1;
99 result = '(?:' + result + ')';
104 if (beg.charAt(0) === '[') {
106 beg = '\\[' + beg.slice(1);
111 result = beg + result;
115 if (end.slice(-1) === ']') {
117 end = end.slice(0, end.length - 1) + '\\]';
126 result = result.split('][').join(']|[');
127 if (result.indexOf('|') !== -1 && !/\(\?/.test(result)) {
128 result = '(?:' + result + ')';
132 result = result.replace(/\[+=|=\]+/g, '\\b');
136 brackets.makeRe = function(pattern) {
138 return new RegExp(brackets(pattern));
142 brackets.isMatch = function(str, pattern) {
144 return brackets.makeRe(pattern).test(str);
150 brackets.match = function(arr, pattern) {
151 var len = arr.length, i = 0;
152 var res = arr.slice();
154 var re = brackets.makeRe(pattern);