Некорректное определение длины завершения обратной ссылки если подмаска еще не совпала

Issue #68 closed
Oleg Sychev repo owner created an issue

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)

  1. Valeriy Streltsov

    ``` Исправлено. Добавил также в determine_characters_left() проверку при встрече обратной ссылки, что нужная подмаска вообще есть - иначе могло быть исключение. ```

    Reported by `vostreltsov` on 2011-11-28 11:13:22 - Status changed: `Fixed`

  2. Oleg Sychev 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

  3. Valeriy Streltsov

    ``` По поводу 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

  4. Oleg Sychev reporter

    ``` "По поводу 2 и строки 0aaaaaaz не согласен. Алгоритм на стадии матчинга найдет максимально длинное совпадение с подмаской длиной 6" - с чем не согласен то? У меня тоже там 6 написано было...

    Тест 3 - я не вижу такой строки, как у меня - abab Ваши строки дают полное совпадение подмаски перед нарушением, это действительно "почти то же самое уже было". А я хотел чтобы был момент частичного совпадения подмаски под квантификатором. В этом случае \1 под квантификатором (которая будет закончена) и \1 в конце выражения будут иметь разную длину, т.к. это разные совпадения... Вот это я и хотел протестировать. Доделайте пожалуйста.

    Остальные тесты в порядке. ```

    Reported by `oasychev` on 2011-11-28 16:48:53

  5. Oleg Sychev reporter

    ``` Выявилась проблема с тестом 3 ```

    Reported by `oasychev` on 2011-11-28 17:13:33 - Status changed: `InProgress`

  6. Log in to comment