Некорректное определение длины завершения обратной ссылки если подмаска еще не совпала
Originally reported on Google Code with ID 68 ``` Регулярное выражение Do ([cbr]at(s|)) eat ([cbr]at\2)\? Строка Do hats eat cats?
Результаты: Last index = 2 Left = 13
13 - очень странный ответ. Если мы берем пустое совпадение с подмаской (не писать s: Do cat eat cat?) то длина будет 12; если берем s то они должны добавиться обе: Do cats eat cats? и получится 14. 13 - явная ошибка...
По логике вещей, для определения длины обратной ссылки в случае если подмаска еще не совпала, необходимо использовать ту же волну, что и определяет длину вообще.
Эту ошибку надо исправить... ```
Reported by `oasychev` on 2011-11-27 21:25:31
Comments (7)
-
-
reporter ``` Юнит-тестов маловато - в этом примере подмаска всего то длины 0 или 1. Надо протестировать более серьезные ситуации. 1) 0(abc|defghx)123\1 строки: 0x (нарушение до начала подмаски, путь должен просчитаться по abc) 0as (нарушение в подмаске по короткому пути) 0defab (нарушение в подмаске по длинному пути, должна выбрать его - пока мы не предусматриваем возможности вернуться назад и генерировать след. символ не с конца совпадения)
2) 0(a{5,10})123\1 0x - должна взять длину подмаски 5, по минимуму - не одни же альтернативы на это влияют... 0aaaaaaz - будет брать длину 6 - это должно пройти легко, но на всяк. случай...
3) (a|b\1)+x\1 abab - удостовериться, что берутся разные значения подмасок: для завершения ссылки в квантификаторе - ba - с прошлого совпадения; а для завершающей обратной ссылки bba - новое совпадение, которое произошло после того как квантификатор закончился. Будет видно по количеству оставшихся символов...
```
Reported by `oasychev` on 2011-11-28 12:07:38
-
``` По поводу 2 и строки 0aaaaaaz не согласен. Алгоритм на стадии матчинга найдет максимально длинное совпадение с подмаской длиной 6, а не 5 символов. и результат будет 9 символов: 6 на повторение подмаски и 3 на цифры.
Тест 3 добавил на всякий случай, но почти то же самое уже было - см. тест data_for_test_backref_tricky_2 - только без x\1 в конец. ```
Reported by `vostreltsov` on 2011-11-28 13:22:47
-
reporter ``` "По поводу 2 и строки 0aaaaaaz не согласен. Алгоритм на стадии матчинга найдет максимально длинное совпадение с подмаской длиной 6" - с чем не согласен то? У меня тоже там 6 написано было...
Тест 3 - я не вижу такой строки, как у меня - abab Ваши строки дают полное совпадение подмаски перед нарушением, это действительно "почти то же самое уже было". А я хотел чтобы был момент частичного совпадения подмаски под квантификатором. В этом случае \1 под квантификатором (которая будет закончена) и \1 в конце выражения будут иметь разную длину, т.к. это разные совпадения... Вот это я и хотел протестировать. Доделайте пожалуйста.
Остальные тесты в порядке. ```
Reported by `oasychev` on 2011-11-28 16:48:53
-
reporter ``` Выявилась проблема с тестом 3 ```
Reported by `oasychev` on 2011-11-28 17:13:33 - Status changed: `InProgress`
-
Reported by `vostreltsov` on 2011-11-29 19:41:26 - Status changed: `Fixed`
-
reporter Reported by `oasychev` on 2011-12-12 12:51:57 - Status changed: `Done`
- Log in to comment
``` Исправлено. Добавил также в determine_characters_left() проверку при встрече обратной ссылки, что нужная подмаска вообще есть - иначе могло быть исключение. ```
Reported by `vostreltsov` on 2011-11-28 11:13:22 - Status changed: `Fixed`