Source code
Revision control
Copy as Markdown
Other Tools
// Copyright 2017 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
Function argument to String.prototype.replace gets groups as the last argument
esid: sec-regexp.prototype-@@replace
features: [regexp-named-groups]
info: |
RegExp.prototype [ @@replace ] ( string, replaceValue )
14. Repeat, for each result in results,
j. Let namedCaptures be ? Get(result, "groups").
k. If functionalReplace is true, then
iv. If namedCaptures is not undefined,
1. Append namedCaptures as the last element of replacerArgs.
---*/
let source = "(?<fst>.)(?<snd>.)";
let alternateSource = "(?<fst>.)|(?<snd>.)";
for (let flags of ["g", "gu"]) {
let i = 0;
let re = new RegExp(source, flags);
let result = "abcd".replace(re,
(match, fst, snd, offset, str, groups) => {
if (i == 0) {
assert.sameValue("ab", match);
assert.sameValue("a", groups.fst);
assert.sameValue("b", groups.snd);
assert.sameValue("a", fst);
assert.sameValue("b", snd);
assert.sameValue(0, offset);
assert.sameValue("abcd", str);
} else if (i == 1) {
assert.sameValue("cd", match);
assert.sameValue("c", groups.fst);
assert.sameValue("d", groups.snd);
assert.sameValue("c", fst);
assert.sameValue("d", snd);
assert.sameValue(2, offset);
assert.sameValue("abcd", str);
} else {
assertUnreachable();
}
i++;
return `${groups.snd}${groups.fst}`;
});
assert.sameValue("badc", result);
assert.sameValue(i, 2);
let re2 = new RegExp(alternateSource, flags);
assert.sameValue("undefinedundefinedundefinedundefined",
"abcd".replace(re2,
(match, fst, snd, offset, str, groups) => groups.snd));
}
reportCompare(0, 0);