Skip to content

Commit 0344806

Browse files
committed
Merge branch 'le0pard-fix-match-groups-replace'
2 parents 8664d4a + e1859e0 commit 0344806

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ console.log('re2_res : ' + re2_res); // prints: re2_res : abc,a,b,c
353353

354354
## Release history
355355

356+
- 1.20.3 *Fix: subsequent numbers are incorporated into group if they would form a legal group reference.*
356357
- 1.20.2 *Fix: added a missing C++ file, which caused a bug on Alpine Linux. Thx, [rbitanga-manticore](https://github.com/rbitanga-manticore).*
357358
- 1.20.1 *Fix: files included in the npm package to build the C++ code.*
358359
- 1.20.0 *Updated RE2. New version uses `abseil-cpp` and required the adaptation work. Thx, [Stefano Rivera](https://github.com/stefanor).*

lib/replace.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ inline std::string replace(const char *data, size_t size, const std::vector<re2:
142142
result += (std::string)groups[index2];
143143
continue;
144144
}
145+
else if (index && index < groups.size())
146+
{
147+
result += (std::string)groups[index];
148+
result += ch;
149+
continue;
150+
}
145151
result += '$';
146152
result += '0' + index;
147153
result += ch;

tests/test_replace.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,5 +334,47 @@ unit.add(module, [
334334
var re = new RE2(/b(?<a>1)? & (?<b>2)?y/);
335335
var result = re.replace('ab & yz', replacer);
336336
eval(t.TEST("result === 'az'"));
337+
},
338+
function test_replaceGroupSimple(t) {
339+
'use strict';
340+
341+
var re = new RE2(/(2)/);
342+
343+
var result = re.replace('123', '$0');
344+
eval(t.TEST("result === '1$03'"));
345+
result = re.replace('123', '$1');
346+
eval(t.TEST("result === '123'"));
347+
result = re.replace('123', '$2');
348+
eval(t.TEST("result === '1$23'"));
349+
350+
result = re.replace('123', '$00');
351+
eval(t.TEST("result === '1$003'"));
352+
result = re.replace('123', '$01');
353+
eval(t.TEST("result === '123'"));
354+
result = re.replace('123', '$02');
355+
eval(t.TEST("result === '1$023'"));
356+
},
357+
function test_replaceGroupCases(t) {
358+
'use strict';
359+
360+
var re = new RE2(/(test)/g);
361+
var result = re.replace('123', '$1$20');
362+
eval(t.TEST("result === '123'"));
363+
364+
re = new RE2(/(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)/g);
365+
result = re.replace('abcdefghijklmnopqrstuvwxyz123', '$10$20');
366+
eval(t.TEST("result === 'jb0wo0123'"));
367+
368+
re = new RE2(/(.)(.)(.)(.)(.)/g);
369+
result = re.replace('abcdefghijklmnopqrstuvwxyz123', '$10$20');
370+
eval(t.TEST("result === 'a0b0f0g0k0l0p0q0u0v0z123'"));
371+
372+
re = new RE2(/(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)/g);
373+
result = re.replace('abcdefghijklmnopqrstuvwxyz123', '$10$20');
374+
eval(t.TEST("result === 'jtvwxyz123'"));
375+
376+
re = new RE2(/abcd/g);
377+
result = re.replace('abcd123', '$1$2');
378+
eval(t.TEST("result === '$1$2123'"));
337379
}
338380
]);

0 commit comments

Comments
 (0)