Spaces:
Running
on
T4
Running
on
T4
| /** @flow */ | |
| ; | |
| function getRelocatable(re) { | |
| // In the future, this could use a WeakMap instead of an expando. | |
| if (!re.__matchAtRelocatable) { | |
| // Disjunctions are the lowest-precedence operator, so we can make any | |
| // pattern match the empty string by appending `|()` to it: | |
| // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-patterns | |
| var source = re.source + "|()"; | |
| // We always make the new regex global. | |
| var flags = "g" + (re.ignoreCase ? "i" : "") + (re.multiline ? "m" : "") + (re.unicode ? "u" : "") | |
| // sticky (/.../y) doesn't make sense in conjunction with our relocation | |
| // logic, so we ignore it here. | |
| ; | |
| re.__matchAtRelocatable = new RegExp(source, flags); | |
| } | |
| return re.__matchAtRelocatable; | |
| } | |
| function matchAt(re, str, pos) { | |
| if (re.global || re.sticky) { | |
| throw new Error("matchAt(...): Only non-global regexes are supported"); | |
| } | |
| var reloc = getRelocatable(re); | |
| reloc.lastIndex = pos; | |
| var match = reloc.exec(str); | |
| // Last capturing group is our sentinel that indicates whether the regex | |
| // matched at the given location. | |
| if (match[match.length - 1] == null) { | |
| // Original regex matched. | |
| match.length = match.length - 1; | |
| return match; | |
| } else { | |
| return null; | |
| } | |
| } | |
| module.exports = matchAt; |