Summary: | Regex capture groups for text fails beyond \9 | ||
---|---|---|---|
Product: | [Applications] kate | Reporter: | Kyle Neal <nealkyle5> |
Component: | general | Assignee: | Burkhard Lück <lueck> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | christoph, kare.sars, kde-doc-english |
Priority: | NOR | ||
Version First Reported In: | 3.14.3 | ||
Target Milestone: | --- | ||
Platform: | Ubuntu | ||
OS: | Linux | ||
Latest Commit: | http://commits.kde.org/ktexteditor/a3c1bab8c301ae4af84a57b7d6bc2753bec40e7d | Version Fixed In: | |
Sentry Crash Report: |
Description
Kyle Neal
2016-07-05 20:22:35 UTC
I can confirm that this is the case both for the built-in search and the plugin :( Git commit c06dc8d8d63f2c852a4b0adcd012bd2fa2b37e69 by Christoph Cullmann. Committed on 08/09/2016 at 17:11. Pushed by cullmann into branch 'master'. Bug 365124 - Regex capture groups for text fails beyond \9 (edit) first part of fix: fix the search in files plugin M +7 -3 addons/search/replace_matches.cpp http://commits.kde.org/kate/c06dc8d8d63f2c852a4b0adcd012bd2fa2b37e69 Git commit a3c1bab8c301ae4af84a57b7d6bc2753bec40e7d by Christoph Cullmann. Committed on 08/09/2016 at 17:38. Pushed by cullmann into branch 'master'. Bug 365124 - Regex capture groups for text fails beyond \9 (edit) CHANGELOG: Support regular expressions replaces with captures > \9, e.g. \111 M +1 -1 autotests/src/searchbar_test.cpp M +16 -3 src/search/kateregexpsearch.cpp http://commits.kde.org/ktexteditor/a3c1bab8c301ae4af84a57b7d6bc2753bec40e7d See: Git commit 650f1a3a854fa9a27b9ffab563306327f8aa5c1a by Christoph Cullmann. Committed on 08/09/2016 at 20:17. Pushed by cullmann into branch 'master'. support multi char captures only in {xxx} to avoid regressions M +1 -1 autotests/src/searchbar_test.cpp M +14 -2 src/search/kateregexpsearch.cpp http://commits.kde.org/ktexteditor/650f1a3a854fa9a27b9ffab563306327f8aa5c1a diff --git a/autotests/src/searchbar_test.cpp b/autotests/src/searchbar_test.cpp index c5b8e69..e3c568e 100644 --- a/autotests/src/searchbar_test.cpp +++ b/autotests/src/searchbar_test.cpp @@ -632,7 +632,7 @@ void SearchBarTest::testReplaceManyCapturesBug365124() bar.setSearchPattern("^(.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*)$"); bar.setSearchMode(KateSearchBar::MODE_REGEX); - bar.setReplacementPattern("\\1::\\2::\\3::\\4::\\5::\\6::\\7::\\8::\\9::\\10::\\11::\\12::\\13"); + bar.setReplacementPattern("\\{1}::\\2::\\3::\\4::\\5::\\6::\\7::\\8::\\9::\\{10}::\\{11}::\\{12}::\\{13}"); bar.replaceAll(); diff --git a/src/search/kateregexpsearch.cpp b/src/search/kateregexpsearch.cpp index 1ba7abd..2eea756 100644 --- a/src/search/kateregexpsearch.cpp +++ b/src/search/kateregexpsearch.cpp @@ -555,6 +555,7 @@ QVector<KTextEditor::Range> KateRegExpSearch::search( } break; + // single letter captures case L'1': case L'2': case L'3': @@ -564,8 +565,15 @@ QVector<KTextEditor::Range> KateRegExpSearch::search( case L'7': case L'8': case L'9': { - // allow 1212124.... captures, see bug 365124 + testReplaceManyCapturesBug365124 - int capture = 9 - (L'9' - text[input + 1].unicode()); + out << ReplacementStream::cap(9 - (L'9' - text[input + 1].unicode())); + input += 2; + break; + } + + // multi letter captures + case L'{': { + // allow {1212124}.... captures, see bug 365124 + testReplaceManyCapturesBug365124 + int capture = 0; int captureSize = 2; while ((input + captureSize) < inputLen) { const ushort nextDigit = text[input + captureSize].unicode(); @@ -574,6 +582,10 @@ QVector<KTextEditor::Range> KateRegExpSearch::search( ++captureSize; continue; } + if (nextDigit == L'}') { + ++captureSize; + break; + } break; } out << ReplacementStream::cap(capture); To avoid problems like "how to use \1 with a 2 behind without it is a \12", we now use \{12} as syntax for multi-digit matches (which didn't work before at all) e.g. \{12}1 => use capture 12 \123 => use capture 1, rest ist normal text Could we add hints to \1 and \{13212} style capture references to the docs? done by Yuri Chornoivan with https://commits.kde.org/kate/2cc3de482b791aee99e651d613d8cd4924b17f23 |