View Issue Details

IDProjectCategoryView StatusLast Update
0001694Double CommanderDefaultpublic2020-11-30 07:43
Reportercordylus Assigned ToAlexx2000  
PrioritynormalSeveritymajorReproducibilityalways
Status closedResolutionfixed 
ProjectionnoneETAnone 
Product Version0.7.7 
Target Version0.8.0Fixed in Version0.8.0 
Summary0001694: Replace by in the Find files dialog should understand Regexp (\0, \1, \r, \n) when the appropriate checkbox is set
DescriptionПоиск по файлам с заменой: поиск по регулярному выражению работает, а замена только обычным текстом. Хотелось бы видеть замену с поддержкой захваченных групп и переносов строк, как и положено для замены с включенной галочкой Regular expression.

Не уверен, что ставить - баг или feature. Оформляю все же как баг, т.к. интуитивно оно должно работать.

В частности, только что испортил себе кучу файлов (хорошо, что их можно перекачать), попытавшись провести замену \r\n на \n
TagsNo tags attached.
Attached Files
ufindthread.pas.patch (411 bytes)   
Index: src/ufindthread.pas
===================================================================
--- src/ufindthread.pas	(revision 7565)
+++ src/ufindthread.pas	(working copy)
@@ -381,7 +381,7 @@
   end;
 
   if bRegExp then
-    S := ReplaceRegExpr(SearchString, S, replaceString, False)
+    S := ReplaceRegExpr(SearchString, S, replaceString, True)
   else
     begin
       Include(Flags, rfReplaceAll);
ufindthread.pas.patch (411 bytes)   
Fixed in Revision7569
Operating system
Widgetset
Architecture

Activities

cordylus

2017-05-16 11:45

developer   ~0002230

Достаточно изменть один параметр, см. патч. Жаль только, для исправления переводов строк осталось непригодно - \n под Windows считается как \r\n, но и без этого полезно.

Skif_off

2017-05-18 06:24

reporter   ~0002240

cordylus, а использование кодов символов (\x0A на \x0D\x0A) не прокатывает?

cordylus

2017-05-19 08:05

developer   ~0002241

Skif_off, хорошая идея, но не помогло.

Результаты экспериментов (под Windows):

Find by:
\r - находит \r
\n - находит \n
\x0A - находит \n

Replace by:
\r - заменяет на символ r
\n - заменяет на \r\n
\x0A - заменяет на символы x0A

Выходит абсурдная ситуация: поиск с заменой \n на \n заменяет \r\n на \r\r\n.

Skif_off

2017-05-19 13:32

reporter   ~0002242

Похоже, \n работает как esc-последовательность, а не метасимвол регэкспов. И удваивание слэша не срабатывает.
Какая-то логика в этом определённо должна быть, по идее в поле замены вообще нигде нельзя воткнуть всё, что придёт в голову.

Задачу с заменой \r\n на \n, похоже, можно решить так: "(\r)(\n?)" на "$2".

cordylus

2017-05-20 02:47

developer   ~0002244

Да, так и правда получается, спасибо. А \n на \r\n - через замену "[^\r]\n" на "\n".

Насчет странного поведения - я ещё проверил последнюю версию TRegExpr, так в ней и \n уже не работает, тоже на символ заменяет. А в той, что поставляется в комплекте с FPC - ещё работает.

Skif_off

2017-05-20 16:18

reporter   ~0002247

Вообще, использование метасимволов в строке замены мало где работает, если вообще работает. В текстовых редакторах есть отдельный режим поиска/замены, связанный с использованием esc-последовательностей, так и называется обычно. https://msdn.microsoft.com/ru-ru/library/h21280bw.aspx
Т.е. получается, что сейчас становится правильнее, не смешивая регэкспы и esc-последовательности в кучу. То, что \n срабатывало, а \r - нет, результат "переходного периода"?

Остаётся вопрос с встроенным текстовым редактором, но результата можно добиваться, учитывая нюансы (исключением [^<нечто>] и за счёт той же подстановки: тупо добавив в конце выражения что-то типа "(<нужное>?)" и обращаться к нему через "$n".

Issue History

Date Modified Username Field Change
2017-01-15 19:18 cordylus New Issue
2017-05-16 11:34 cordylus File Added: ufindthread.pas.patch
2017-05-16 11:45 cordylus Note Added: 0002230
2017-05-17 22:51 Alexx2000 Assigned To => Alexx2000
2017-05-17 22:51 Alexx2000 Status new => assigned
2017-05-17 22:51 Alexx2000 Target Version => 0.8.0
2017-05-17 22:53 Alexx2000 Fixed in Revision => 7569
2017-05-17 22:53 Alexx2000 Status assigned => resolved
2017-05-17 22:53 Alexx2000 Fixed in Version => 0.8.0
2017-05-17 22:53 Alexx2000 Resolution open => fixed
2017-05-18 06:24 Skif_off Note Added: 0002240
2017-05-19 08:05 cordylus Note Added: 0002241
2017-05-19 13:32 Skif_off Note Added: 0002242
2017-05-20 02:47 cordylus Note Added: 0002244
2017-05-20 16:18 Skif_off Note Added: 0002247
2020-11-30 07:43 Alexx2000 Status resolved => closed