diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2017-08-31 03:43:11 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2017-08-31 03:43:11 +0300 |
commit | b8a96d789253c91093476f898611d5903799e84e (patch) | |
tree | 510bad1358bc443a0b47a1fd8c9d55057c4fa411 | |
parent | 0cf84e1f006988c114bdca36715d3a2c0601a7d5 (diff) |
Fix regex_replace_ex() to ignore unmatched sub-expression references
-rw-r--r-- | libbutl/regex.txx | 10 | ||||
-rw-r--r-- | tests/regex/testscript | 10 |
2 files changed, 14 insertions, 6 deletions
diff --git a/libbutl/regex.txx b/libbutl/regex.txx index 536cabf..dd1a539 100644 --- a/libbutl/regex.txx +++ b/libbutl/regex.txx @@ -169,9 +169,10 @@ namespace butl if (si > 0) { - // m[0] refers to the matched substring. + // m[0] refers to the matched substring. Note that we + // ignore unmatched sub-expression references. // - if (static_cast<size_t> (si) < m.size ()) + if (static_cast<size_t> (si) < m.size () && m[si].matched) append_str (m[si].first, m[si].second); } else @@ -212,9 +213,10 @@ namespace butl int si (digit (c)); if (si > 0) { - // m[0] refers to the matched substring. + // m[0] refers to the matched substring. Note that we + // ignore unmatched sub-expression references. // - if (static_cast<size_t> (si) < m.size ()) + if (static_cast<size_t> (si) < m.size () && m[si].matched) append_str (m[si].first, m[si].second); } else diff --git a/tests/regex/testscript b/tests/regex/testscript index 1af604c..8291f36 100644 --- a/tests/regex/testscript +++ b/tests/regex/testscript @@ -21,7 +21,10 @@ : capture : - $* abcdefghij '(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)' '$1$10' >aj + { + $* abcdefghij '(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)' '$1$10' >aj : matched + $* a '(a)|(b)' '$1$2$3' >a : unmatched + } } : perl-escape @@ -33,7 +36,10 @@ : capture : - $* abcdefghij '(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)' '\1\10' >aa0 + { + $* abcdefghij '(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)' '\1\10' >aa0 : matched + $* a '(a)|(b)' '\1\2\3' >a : unmatched + } : upper : |