View Issue Details

IDProjectCategoryView StatusLast Update
0002708Far ManagerRegExppublic2015-02-02 14:04
ReporterAleXHAssigned To2useven10 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Platformx86OSWindowsOS VersionXP SP2
Product Version3.0 
Target VersionFixed in Version3.0 
Summary0002708: Regexp "^(.*?\-\-)" != "^(.*?\-{2})"
DescriptionПоиск в редакторе шаблона "^(.*?\-\-)" не матчит строку " --", но "^(.*?\-{2})" матчит.
Steps To ReproduceОткрыть пустой файл, создать строку " --" (пробел-2 минуса), поставить курсор на первый символ, F7 Поиск, регэксп включено, шаблон "^(.*?\-\-)" без кавычек.
TagsNo tags attached.
Build4258

Activities

shmuel

2014-06-16 00:38

developer   bugnote:0012509

Last edited: 2014-06-16 12:27

View 2 revisions

Интересно, что в S&R (который использует тот же движок, только до переделки на юникод) это работает, а в Фаре - нет (пробовал разные билды: от 2.0.1324 до 3.0.3951).

2useven10

2014-06-16 15:48

developer   bugnote:0012510

А как должно работать?
Вопрос переключает .* в нежадный режим?

shmuel

2014-06-16 15:53

developer   bugnote:0012511

> А как должно работать?

В соответствии с регекспом.

> Вопрос переключает .* в нежадный режим?

Да.

2useven10

2014-06-16 17:51

developer   bugnote:0012514

Там в лямбде MinSkip() (и его предшественнике MINSKIP() в первой версии, которая есть в svn) откровенный бред. Замена #define MINSKIP() на лямбду тоже выполнена некорректно, но в данном случае это несущественно.

2useven10

2014-06-16 23:50

developer   bugnote:0012515

3952 -- нужна проверка

shmuel

2014-06-17 00:04

developer   bugnote:0012516

Всё красиво, по крайней мере те проверки, что у меня есть, прошли.

shmuel

2014-06-20 18:11

developer   bugnote:0012528

AleXH, на случай, если вы не в курсе:
Данный тикет находится в состоянии feedback, и ожидает его именно от вас, как от изначального репортера.

AleXH

2014-06-20 18:22

reporter   bugnote:0012529

Прошу прощения, ранее мантисом не приходилось пользоваться, поэтому в прострации.

Да, теперь ищет правильно.

shmuel

2014-12-21 10:28

developer   bugnote:0013354

Обнаружилось, что исправление исходной неисправности привело к появлению другой неисправности:

far.Show(regex.find("abca", "a*?ca"))
Ожидаем увидеть: 3, 4
Видим: 1, 4

DrKnS

2014-12-29 01:29

administrator   bugnote:0013372

Проверьте с аттачем.

Я хз, в этом проблема или нет, но декремент и проверка на неравенство нулю отрицательных чисел как-то попахивает.

DrKnS

2014-12-29 01:33

administrator  

re_2708.diff (4,015 bytes)
Index: RegExp.cpp
===================================================================
--- RegExp.cpp	(revision 12787)
+++ RegExp.cpp	(working copy)
@@ -1806,7 +1806,7 @@
 					jj = std::next(op)->symbol;
 					if(*str!=jj)
 					{
-						while(str<strend && cmp() && st.max--)
+						while(str<strend && cmp() && st.max-- > 0)
 						{
 							str++;
 							if(str[0]==jj)
@@ -1819,7 +1819,7 @@
 					jj = std::next(op)->symbol;
 					if(*str==jj)
 					{
-						while(str<strend && cmp() && st.max--)
+						while(str<strend && cmp() && st.max-- > 0)
 						{
 							str++;
 							if(str[0]!=jj)
@@ -1832,7 +1832,7 @@
 					jj = std::next(op)->symbol;
 					if(TOLOWER(*str)!=jj)
 					{
-						while(str<strend && cmp() && st.max--)
+						while(str<strend && cmp() && st.max-- > 0)
 						{
 							str++;
 							if(TOLOWER(str[0])==jj)
@@ -1845,7 +1845,7 @@
 					jj = std::next(op)->symbol;
 					if(TOLOWER(*str)==jj)
 					{
-						while(str<strend && cmp() && st.max--)
+						while(str<strend && cmp() && st.max-- > 0)
 						{
 							str++;
 							if(TOLOWER(str[0])!=jj)
@@ -1858,7 +1858,7 @@
 					jj = std::next(op)->type;
 					if(!isType(*str,jj))
 					{
-						while(str<strend && cmp() && st.max--)
+						while(str<strend && cmp() && st.max-- > 0)
 						{
 							str++;
 							if(isType(str[0],jj))
@@ -1871,7 +1871,7 @@
 					jj = std::next(op)->type;
 					if(isType(*str,jj))
 					{
-						while(str<strend && cmp() && st.max--)
+						while(str<strend && cmp() && st.max-- > 0)
 						{
 							str++;
 							if(!isType(str[0],jj))
@@ -1884,7 +1884,7 @@
 					cl = std::next(op)->symbolclass;
 					if(!cl->GetBit(*str))
 					{
-						while(str<strend && cmp() && st.max--)
+						while(str<strend && cmp() && st.max-- > 0)
 						{
 							str++;
 							if(cl->GetBit(str[0]))
@@ -2480,7 +2480,7 @@
 
 						if (!minimizing)
 						{
-							while (str<strend && *str!=0x0d && *str!=0x0a && st.max--)str++;
+							while (str<strend && *str!=0x0d && *str!=0x0a && st.max-- > 0)str++;
 						}
 						else
 						{
@@ -2555,7 +2555,7 @@
 
 						if (!minimizing)
 						{
-							while (str<strend && TOLOWER(*str)==op->range.symbol && st.max--)str++;
+							while (str<strend && TOLOWER(*str)==op->range.symbol && st.max-- > 0)str++;
 						}
 						else
 						{
@@ -2577,7 +2577,7 @@
 
 						if (!minimizing)
 						{
-							while (str<strend && *str==op->range.symbol && st.max--)str++;
+							while (str<strend && *str==op->range.symbol && st.max-- > 0)str++;
 						}
 						else
 						{
@@ -2616,7 +2616,7 @@
 
 						if (!minimizing)
 						{
-							while (str<strend && TOLOWER(*str)!=op->range.symbol && st.max--)str++;
+							while (str<strend && TOLOWER(*str)!=op->range.symbol && st.max-- > 0)str++;
 						}
 						else
 						{
@@ -2638,7 +2638,7 @@
 
 						if (!minimizing)
 						{
-							while (str<strend && *str!=op->range.symbol && st.max--)str++;
+							while (str<strend && *str!=op->range.symbol && st.max-- > 0)str++;
 						}
 						else
 						{
@@ -2675,7 +2675,7 @@
 
 					if (!minimizing)
 					{
-						while (str<strend && op->range.symbolclass->GetBit(*str) && st.max--)str++;
+						while (str<strend && op->range.symbolclass->GetBit(*str) && st.max-- > 0)str++;
 					}
 					else
 					{
@@ -2711,7 +2711,7 @@
 
 					if (!minimizing)
 					{
-						while (str<strend && isType(*str,op->range.type) && st.max--)str++;
+						while (str<strend && isType(*str,op->range.type) && st.max-- > 0)str++;
 					}
 					else
 					{
@@ -2747,7 +2747,7 @@
 
 					if (!minimizing)
 					{
-						while (str<strend && !isType(*str,op->range.type) && st.max--)str++;
+						while (str<strend && !isType(*str,op->range.type) && st.max-- > 0)str++;
 					}
 					else
 					{
@@ -2801,7 +2801,7 @@
 
 					if (!minimizing)
 					{
-						while (str<strend && StrCmp(str,start+m->start,start+m->end) && st.max--);
+						while (str<strend && StrCmp(str,start+m->start,start+m->end) && st.max-- > 0);
 					}
 					else
 					{
re_2708.diff (4,015 bytes)

shmuel

2014-12-29 01:54

developer   bugnote:0013373

> Проверьте с аттачем.
Данный патч вроде исправляет обе неисправности данного тикета, но появляется новая:
    lua:=regex.find("ab", "^.*b")
Ожидаем увидеть 1,2, видим nil.

2useven10

2014-12-29 10:30

developer   bugnote:0013374

max берётся из match.end, который по дефолту ставится в 'бесконечность':
RegExpMatch sm;
sm.start = -1;
sm.end = -1;
так что патчить так нельзя.

shmuel

2015-01-29 14:33

developer   bugnote:0013451

> Обнаружилось, что исправление исходной неисправности привело к появлению другой неисправности

Сейчас перепроверил: я ошибся, эта другая неисправность существовала и до билда 3952.

2useven10

2015-01-29 17:18

developer   bugnote:0013453

Так есть ли юникодная версия без ошибки №2?

JohnDoe

2015-01-29 17:22

updater   bugnote:0013454

>Ожидаем увидеть: 3, 4
Не понял

2useven10

2015-01-29 17:42

developer   bugnote:0013455

match: begin=3, end=4

JohnDoe

2015-01-29 17:45

updater   bugnote:0013456

Не понял почему ожидаются эти числа (и соответственно чем неправильны 1,4)

2useven10

2015-01-29 17:54

developer   bugnote:0013457

Last edited: 2015-01-29 17:57

View 2 revisions

*? -- нежадный режим, для него должно быть 3,4

shmuel

2015-01-29 17:55

developer   bugnote:0013458

> Так есть ли юникодная версия без ошибки №2?

Есть. В билде 3291 ещё хорошо, в 3295 уже плохо.
Судя по чейнжлогу, неисправность вероятно появилась в 3295.

shmuel

2015-01-29 18:02

developer   bugnote:0013460

> *? -- нежадный режим, для него должно быть 3,4

Жадность тут ни при чём.

JohnDoe

2015-01-29 18:15

updater   bugnote:0013461

Точно, проглядел. В фаре конкретный баг: "a" не должно мачить "b" ни при каких условиях

2useven10

2015-01-29 18:29

developer   bugnote:0013462

Last edited: 2015-01-29 18:29

View 2 revisions

да согласен, нежадность только приводит к выдаче неправильного результата.

shmuel

2015-01-30 11:17

developer   bugnote:0013463

Last edited: 2015-01-30 11:21

View 2 revisions

> Судя по чейнжлогу, неисправность вероятно появилась в 3295

Собрал 3294, в нём этой неисправности нет. Значит точно 3295.

Ради интереса собрал 638 (первый билд Фара с регулярными выражениями). "Первая" неисправность (т.е. исходная в данном тикете) там уже присутствует.

2useven10

2015-01-30 19:45

developer   bugnote:0013464

4257

shmuel

2015-01-30 20:17

developer   bugnote:0013465

4257 - вроде всё нормально.

DrKnS

2015-01-30 20:28

administrator   bugnote:0013466

4958.

2useven10

2015-01-30 21:11

developer   bugnote:0013468

Last edited: 2015-01-30 21:12

View 2 revisions

@DrKnS
Не надо передёргивать.
Исправлен баг в 3295, недобитый в 3592.

Issue History

Date Modified Username Field Change
2014-06-16 00:27 AleXH New Issue
2014-06-16 00:35 shmuel Reproducibility have not tried => always
2014-06-16 00:35 shmuel Category Editor => RegExp
2014-06-16 00:38 shmuel Note Added: 0012509
2014-06-16 12:27 shmuel Note Edited: 0012509 View Revisions
2014-06-16 15:48 2useven10 Note Added: 0012510
2014-06-16 15:53 shmuel Note Added: 0012511
2014-06-16 17:51 2useven10 Note Added: 0012514
2014-06-16 23:50 2useven10 Note Added: 0012515
2014-06-16 23:50 2useven10 Assigned To => 2useven10
2014-06-16 23:50 2useven10 Status new => feedback
2014-06-17 00:04 shmuel Note Added: 0012516
2014-06-20 18:11 shmuel Note Added: 0012528
2014-06-20 18:22 AleXH Note Added: 0012529
2014-06-20 18:22 AleXH Status feedback => assigned
2014-06-20 18:28 shmuel Build => 3952
2014-06-20 18:28 shmuel Status assigned => closed
2014-06-20 18:28 shmuel Resolution open => fixed
2014-06-20 18:28 shmuel Fixed in Version => 3.0
2014-12-21 10:28 shmuel Assigned To 2useven10 =>
2014-12-21 10:28 shmuel Note Added: 0013354
2014-12-21 10:28 shmuel Status closed => feedback
2014-12-21 10:28 shmuel Resolution fixed => reopened
2014-12-21 10:28 shmuel Assigned To => shmuel
2014-12-21 10:28 shmuel Status feedback => new
2014-12-21 10:29 shmuel Assigned To shmuel =>
2014-12-29 01:26 DrKnS File Added: re_2708.diff
2014-12-29 01:29 DrKnS Note Added: 0013372
2014-12-29 01:33 DrKnS File Deleted: re_2708.diff
2014-12-29 01:33 DrKnS File Added: re_2708.diff
2014-12-29 01:54 shmuel Note Added: 0013373
2014-12-29 10:30 2useven10 Note Added: 0013374
2015-01-29 14:33 shmuel Note Added: 0013451
2015-01-29 17:18 2useven10 Note Added: 0013453
2015-01-29 17:22 JohnDoe Note Added: 0013454
2015-01-29 17:42 2useven10 Note Added: 0013455
2015-01-29 17:45 JohnDoe Note Added: 0013456
2015-01-29 17:54 2useven10 Note Added: 0013457
2015-01-29 17:55 shmuel Note Added: 0013458
2015-01-29 17:57 2useven10 Note Edited: 0013457 View Revisions
2015-01-29 18:02 shmuel Note Added: 0013460
2015-01-29 18:15 JohnDoe Note Added: 0013461
2015-01-29 18:29 2useven10 Note Added: 0013462
2015-01-29 18:29 2useven10 Note Edited: 0013462 View Revisions
2015-01-30 11:17 shmuel Note Added: 0013463
2015-01-30 11:21 shmuel Note Edited: 0013463 View Revisions
2015-01-30 19:45 2useven10 Note Added: 0013464
2015-01-30 19:45 2useven10 Assigned To => 2useven10
2015-01-30 19:45 2useven10 Status new => feedback
2015-01-30 20:17 shmuel Note Added: 0013465
2015-01-30 20:17 shmuel Status feedback => resolved
2015-01-30 20:28 DrKnS Note Added: 0013466
2015-01-30 21:11 2useven10 Note Added: 0013468
2015-01-30 21:12 2useven10 Note Edited: 0013468 View Revisions
2015-02-02 14:02 2useven10 Build 3952 => 4958
2015-02-02 14:02 2useven10 Status resolved => closed
2015-02-02 14:02 2useven10 Resolution reopened => fixed
2015-02-02 14:04 shmuel Build 4958 => 4258