andgineer / TRegExpr

Regular expressions (regex), pascal.
https://regex.sorokin.engineer/en/latest/
MIT License
174 stars 63 forks source link

Проблема при распознавании киррилических символов #258

Closed iLya2IK closed 3 years ago

iLya2IK commented 3 years ago

Данный код выдает некорректные результаты (выдает 3 совпадения: 'мо?', 'о?' и 'ка', должно выдавать один результат: 'морошка').

  re := TRegExpr.Create('(([а-я]+)|([a-z]+)|(\d+))');
  re.ModifierR := true;
  try
    if re.Exec('морошка') then
      repeat
        Add(re.Match[0]);
      until not re.ExecNext;
  finally
    re.Free;
  end; 

Предполагаю, что проблемы возникают при распознавании символов из utf8-диапазона с префиксом 0xd1 ('р'-'я'), поскольку при замене первой строки на

re := TRegExpr.Create('(([а-пр-я]+)|([a-z]+)|(\d+))'); 

результаты получаются ожидаемыми

Alexey-T commented 3 years ago

Т к при добавлении теста в test_fpc проект я получаю ошибку вида Screenshot from 2021-09-27 12-56-51

то есть порченый текст, я подозреваю некоректную кодировку "морошка" или регулярки еще ДО передачи в код парсера. где-то не хватает utf8encode/decode.

Alexey-T commented 3 years ago

Так и есть- проблемы в тесте, в вашем коде добавьте где надо UTF8Decode/Encode. я добавил в FPC тестер - тест, и написал его не как часть массива а специальным кодом, и работает. https://github.com/alexey-T/tregexpr

iLya2IK commented 3 years ago

Проблема в устаревшей версии regexp (0.987), которая идет в комплекте с lazarus 2.0.12. В текущей версии, скаченной с github, ошибку воспроизвести не смог.