1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | 'use strict';
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | var POSIX = {
|
15 | alnum: 'a-zA-Z0-9',
|
16 | alpha: 'a-zA-Z',
|
17 | blank: ' \\s\\t',
|
18 | cntrl: '\\x00-\\x1F\\x7F',
|
19 | digit: '0-9',
|
20 | graph: '\\x21-\\x7E',
|
21 | lower: 'a-z',
|
22 | print: '\\x20-\\x7E',
|
23 | punct: '!"#$%&\'()\\*+,-./:;<=>?@[\\]^_`{|}~',
|
24 | space: ' \\s\\t\\r\\n\\v\\f',
|
25 | upper: 'A-Z',
|
26 | word: 'A-Za-z0-9_',
|
27 | xdigit: 'A-Fa-f0-9',
|
28 | };
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 | module.exports = brackets;
|
35 |
|
36 | function brackets(str) {
|
37 | var negated = false;
|
38 |
|
39 | if (str.indexOf('[^') !== -1) {
|
40 | negated = true;
|
41 | str = str.split('[^').join('[');
|
42 | }
|
43 | if (str.indexOf('[!') !== -1) {
|
44 | negated = true;
|
45 | str = str.split('[!').join('[');
|
46 | }
|
47 |
|
48 | var a = str.split('[');
|
49 | var b = str.split(']');
|
50 | var imbalanced = a.length !== b.length;
|
51 |
|
52 | var parts = str.split(/(?::\]\[:|\[?\[:|:\]\]?)/);
|
53 | var len = parts.length, i = 0;
|
54 | var end = '', beg = '';
|
55 | var res = [];
|
56 |
|
57 | while (len--) {
|
58 | var inner = parts[i++];
|
59 | if (inner === '^[!' || inner === '[!') {
|
60 | inner = '';
|
61 | negated = true;
|
62 | }
|
63 |
|
64 | var prefix = negated ? '^' : '';
|
65 | var ch = POSIX[inner];
|
66 |
|
67 | if (ch) {
|
68 | res.push('[' + prefix + ch + ']');
|
69 | } else if (inner) {
|
70 | if (/^\[?\w-\w\]?$/.test(inner)) {
|
71 | if (i === parts.length) {
|
72 | res.push('[' + prefix + inner);
|
73 | } else if (i === 1) {
|
74 | res.push(prefix + inner + ']');
|
75 | } else {
|
76 | res.push(prefix + inner);
|
77 | }
|
78 | } else {
|
79 | if (i === 1) {
|
80 | beg += inner;
|
81 | } else if (i === parts.length) {
|
82 | end += inner;
|
83 | } else {
|
84 | res.push('[' + prefix + inner + ']');
|
85 | }
|
86 | }
|
87 | }
|
88 | }
|
89 |
|
90 | var result = res.join('|');
|
91 | var len = res.length || 1;
|
92 | if (len > 1) {
|
93 | result = '(?:' + result + ')';
|
94 | len = 1;
|
95 | }
|
96 | if (beg) {
|
97 | len++;
|
98 | if (beg.charAt(0) === '[') {
|
99 | if (imbalanced) {
|
100 | beg = '\\[' + beg.slice(1);
|
101 | } else {
|
102 | beg += ']';
|
103 | }
|
104 | }
|
105 | result = beg + result;
|
106 | }
|
107 | if (end) {
|
108 | len++;
|
109 | if (end.slice(-1) === ']') {
|
110 | if (imbalanced) {
|
111 | end = end.slice(0, end.length - 1) + '\\]';
|
112 | } else {
|
113 | end = '[' + end;
|
114 | }
|
115 | }
|
116 | result += end;
|
117 | }
|
118 |
|
119 | if (len > 1) {
|
120 | result = result.split('][').join(']|[');
|
121 | if (result.indexOf('|') !== -1 && !/\(\?/.test(result)) {
|
122 | result = '(?:' + result + ')';
|
123 | }
|
124 | }
|
125 |
|
126 | result = result.replace(/\[+=|=\]+/g, '\\b');
|
127 | return result;
|
128 | }
|
129 |
|
130 | brackets.makeRe = function (pattern) {
|
131 | try {
|
132 | return new RegExp(brackets(pattern));
|
133 | } catch (err) {}
|
134 | };
|
135 |
|
136 | brackets.isMatch = function (str, pattern) {
|
137 | try {
|
138 | return brackets.makeRe(pattern).test(str);
|
139 | } catch (err) {
|
140 | return false;
|
141 | }
|
142 | };
|
143 |
|
144 | brackets.match = function (arr, pattern) {
|
145 | var len = arr.length, i = 0;
|
146 | var res = arr.slice();
|
147 |
|
148 | var re = brackets.makeRe(pattern);
|
149 | while (i < len) {
|
150 | var ele = arr[i++];
|
151 | if (!re.test(ele)) {
|
152 | continue;
|
153 | }
|
154 | res.splice(i, 1);
|
155 | }
|
156 | return res;
|
157 | };
|