View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002708 | Far Manager | RegExp | public | 2014-06-15 21:27 | 2015-02-02 11:04 |
Reporter | AleXH | Assigned To | 2useven10 | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | x86 | OS | Windows | OS Version | XP SP2 |
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0002708: Regexp "^(.*?\-\-)" != "^(.*?\-{2})" | ||||
Description | Поиск в редакторе шаблона "^(.*?\-\-)" не матчит строку " --", но "^(.*?\-{2})" матчит. | ||||
Steps To Reproduce | Открыть пустой файл, создать строку " --" (пробел-2 минуса), поставить курсор на первый символ, F7 Поиск, регэксп включено, шаблон "^(.*?\-\-)" без кавычек. | ||||
Tags | No tags attached. | ||||
Build | 4258 | ||||
|
Интересно, что в S&R (который использует тот же движок, только до переделки на юникод) это работает, а в Фаре - нет (пробовал разные билды: от 2.0.1324 до 3.0.3951). |
|
А как должно работать? Вопрос переключает .* в нежадный режим? |
|
> А как должно работать? В соответствии с регекспом. > Вопрос переключает .* в нежадный режим? Да. |
|
Там в лямбде MinSkip() (и его предшественнике MINSKIP() в первой версии, которая есть в svn) откровенный бред. Замена #define MINSKIP() на лямбду тоже выполнена некорректно, но в данном случае это несущественно. |
|
3952 -- нужна проверка |
|
Всё красиво, по крайней мере те проверки, что у меня есть, прошли. |
|
AleXH, на случай, если вы не в курсе: Данный тикет находится в состоянии feedback, и ожидает его именно от вас, как от изначального репортера. |
|
Прошу прощения, ранее мантисом не приходилось пользоваться, поэтому в прострации. Да, теперь ищет правильно. |
|
Обнаружилось, что исправление исходной неисправности привело к появлению другой неисправности: far.Show(regex.find("abca", "a*?ca")) Ожидаем увидеть: 3, 4 Видим: 1, 4 |
|
Проверьте с аттачем. Я хз, в этом проблема или нет, но декремент и проверка на неравенство нулю отрицательных чисел как-то попахивает. |
|
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 { |
|
> Проверьте с аттачем. Данный патч вроде исправляет обе неисправности данного тикета, но появляется новая: lua:=regex.find("ab", "^.*b") Ожидаем увидеть 1,2, видим nil. |
|
max берётся из match.end, который по дефолту ставится в 'бесконечность': RegExpMatch sm; sm.start = -1; sm.end = -1; так что патчить так нельзя. |
|
> Обнаружилось, что исправление исходной неисправности привело к появлению другой неисправности Сейчас перепроверил: я ошибся, эта другая неисправность существовала и до билда 3952. |
|
Так есть ли юникодная версия без ошибки №2? |
|
>Ожидаем увидеть: 3, 4 Не понял |
|
match: begin=3, end=4 |
|
Не понял почему ожидаются эти числа (и соответственно чем неправильны 1,4) |
|
*? -- нежадный режим, для него должно быть 3,4 |
|
> Так есть ли юникодная версия без ошибки №2? Есть. В билде 3291 ещё хорошо, в 3295 уже плохо. Судя по чейнжлогу, неисправность вероятно появилась в 3295. |
|
> *? -- нежадный режим, для него должно быть 3,4 Жадность тут ни при чём. |
|
Точно, проглядел. В фаре конкретный баг: "a" не должно мачить "b" ни при каких условиях |
|
да согласен, нежадность только приводит к выдаче неправильного результата. |
|
> Судя по чейнжлогу, неисправность вероятно появилась в 3295 Собрал 3294, в нём этой неисправности нет. Значит точно 3295. Ради интереса собрал 638 (первый билд Фара с регулярными выражениями). "Первая" неисправность (т.е. исходная в данном тикете) там уже присутствует. |
|
4257 |
|
4257 - вроде всё нормально. |
|
4958. |
|
@DrKnS Не надо передёргивать. Исправлен баг в 3295, недобитый в 3592. |
Date Modified | Username | Field | Change |
---|---|---|---|
2014-06-15 21:27 | AleXH | New Issue | |
2014-06-15 21:35 | shmuel | Reproducibility | have not tried => always |
2014-06-15 21:35 | shmuel | Category | Editor => RegExp |
2014-06-15 21:38 | shmuel | Note Added: 0012509 | |
2014-06-16 09:27 | shmuel | Note Edited: 0012509 | |
2014-06-16 12:48 | 2useven10 | Note Added: 0012510 | |
2014-06-16 12:53 | shmuel | Note Added: 0012511 | |
2014-06-16 14:51 | 2useven10 | Note Added: 0012514 | |
2014-06-16 20:50 | 2useven10 | Note Added: 0012515 | |
2014-06-16 20:50 | 2useven10 | Assigned To | => 2useven10 |
2014-06-16 20:50 | 2useven10 | Status | new => feedback |
2014-06-16 21:04 | shmuel | Note Added: 0012516 | |
2014-06-20 15:11 | shmuel | Note Added: 0012528 | |
2014-06-20 15:22 | AleXH | Note Added: 0012529 | |
2014-06-20 15:22 | AleXH | Status | feedback => assigned |
2014-06-20 15:28 | shmuel | Build | => 3952 |
2014-06-20 15:28 | shmuel | Status | assigned => closed |
2014-06-20 15:28 | shmuel | Resolution | open => fixed |
2014-06-20 15:28 | shmuel | Fixed in Version | => 3.0 |
2014-12-21 07:28 | shmuel | Assigned To | 2useven10 => |
2014-12-21 07:28 | shmuel | Note Added: 0013354 | |
2014-12-21 07:28 | shmuel | Status | closed => feedback |
2014-12-21 07:28 | shmuel | Resolution | fixed => reopened |
2014-12-21 07:28 | shmuel | Assigned To | => shmuel |
2014-12-21 07:28 | shmuel | Status | feedback => new |
2014-12-21 07:29 | shmuel | Assigned To | shmuel => |
2014-12-28 22:26 | DrKnS | File Added: re_2708.diff | |
2014-12-28 22:29 | DrKnS | Note Added: 0013372 | |
2014-12-28 22:33 | DrKnS | File Deleted: re_2708.diff | |
2014-12-28 22:33 | DrKnS | File Added: re_2708.diff | |
2014-12-28 22:54 | shmuel | Note Added: 0013373 | |
2014-12-29 07:30 | 2useven10 | Note Added: 0013374 | |
2015-01-29 11:33 | shmuel | Note Added: 0013451 | |
2015-01-29 14:18 | 2useven10 | Note Added: 0013453 | |
2015-01-29 14:22 | JohnDoe | Note Added: 0013454 | |
2015-01-29 14:42 | 2useven10 | Note Added: 0013455 | |
2015-01-29 14:45 | JohnDoe | Note Added: 0013456 | |
2015-01-29 14:54 | 2useven10 | Note Added: 0013457 | |
2015-01-29 14:55 | shmuel | Note Added: 0013458 | |
2015-01-29 14:57 | 2useven10 | Note Edited: 0013457 | |
2015-01-29 15:02 | shmuel | Note Added: 0013460 | |
2015-01-29 15:15 | JohnDoe | Note Added: 0013461 | |
2015-01-29 15:29 | 2useven10 | Note Added: 0013462 | |
2015-01-29 15:29 | 2useven10 | Note Edited: 0013462 | |
2015-01-30 08:17 | shmuel | Note Added: 0013463 | |
2015-01-30 08:21 | shmuel | Note Edited: 0013463 | |
2015-01-30 16:45 | 2useven10 | Note Added: 0013464 | |
2015-01-30 16:45 | 2useven10 | Assigned To | => 2useven10 |
2015-01-30 16:45 | 2useven10 | Status | new => feedback |
2015-01-30 17:17 | shmuel | Note Added: 0013465 | |
2015-01-30 17:17 | shmuel | Status | feedback => resolved |
2015-01-30 17:28 | DrKnS | Note Added: 0013466 | |
2015-01-30 18:11 | 2useven10 | Note Added: 0013468 | |
2015-01-30 18:12 | 2useven10 | Note Edited: 0013468 | |
2015-02-02 11:02 | 2useven10 | Build | 3952 => 4958 |
2015-02-02 11:02 | 2useven10 | Status | resolved => closed |
2015-02-02 11:02 | 2useven10 | Resolution | reopened => fixed |
2015-02-02 11:04 | shmuel | Build | 4958 => 4258 |