summaryrefslogtreecommitdiffstats
path: root/kate/part/katesearch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kate/part/katesearch.cpp')
-rw-r--r--kate/part/katesearch.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/kate/part/katesearch.cpp b/kate/part/katesearch.cpp
index 8f4911137..96f5128b0 100644
--- a/kate/part/katesearch.cpp
+++ b/kate/part/katesearch.cpp
@@ -377,23 +377,35 @@ void KateSearch::replaceOne()
{
QString replaceWith = m_replacement;
if ( s.flags.regExp && s.flags.useBackRefs ) {
- // replace each "(?!\)\d+" with the corresponding capture
- QRegExp br("\\\\(\\d+)");
+ // Replace each "\0"..."\9" with the corresponding capture,
+ // "\n" and "\t" with newline and tab,
+ // "\\" with "\",
+ // and remove the "\" for any other sequence.
+ QRegExp br("\\\\(.)");
int pos = br.search( replaceWith );
int ncaps = m_re.numCaptures();
while ( pos >= 0 ) {
- QString sc;
- if ( !pos || replaceWith.at( pos-1) != '\\' ) {
- int ccap = br.cap(1).toInt();
+ QString substitute;
+ QChar argument = br.cap(1).at(0);
+ if ( argument.isDigit() ) {
+ // the second character is a digit, this is a backreference
+ int ccap = argument.digitValue();
if (ccap <= ncaps ) {
- sc = m_re.cap( ccap );
- replaceWith.replace( pos, br.matchedLength(), sc );
- }
- else {
+ substitute = m_re.cap( ccap );
+ } else {
kdDebug()<<"KateSearch::replaceOne(): you don't have "<<ccap<<" backreferences in regexp '"<<m_re.pattern()<<"'"<<endl;
+ break;
}
+ } else if ( argument == 'n' ) {
+ substitute = '\n';
+ } else if ( argument == 't' ) {
+ substitute = '\t';
+ } else {
+ // handle a validly escaped backslash, or an invalid escape.
+ substitute = argument;
}
- pos = br.search( replaceWith, pos + (int)sc.length() );
+ replaceWith.replace( pos, br.matchedLength(), substitute );
+ pos = br.search( replaceWith, pos + substitute.length() );
}
}