Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

4 Август 2021, 12:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Regex & AdvancedFilter criteria  (Прочитано 257 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Стартовое сообщение: 18 Июль 2021, 17:49 »

Описал как-то такой баг, который был оставлен без внимания.
Суть дела в том, что если надо отфильтровать строку по числовому фрагменту, то этот фрагмент-подстрока преобразовывается к числу, и фильтр работает неверно.
Напр., надо отобрать записи с кодом "Д01", но не "Д10", "Д11" или "Д21" по критерию "01" (содержит - именно так работает расширенный фильтр по умолчанию).
REGEX вернет то, что просим: "Д01" только, а расширенный фильтр преобразует "01" к числу 1 и вернёт: "Д01", "Д10","Д11" и "Д21" (содержит ведь). В этом и была суть бага.

Противоречивый подход налицо, конечно... Однако, откуда "ноги растут"? Есть новая информация.

Warning:
When using functions where one or more arguments are search criteria strings that represents a regular expression, the first attempt is to convert the string criteria to numbers. For example, ".0" will convert to 0.0 and so on. If successful, the match will not be a regular expression match but a numeric match. However, when switching to a locale where the decimal separator is not the dot makes the regular expression conversion work. To force the evaluation of the regular expression instead of a numeric expression, use some expression that can not be misread as numeric, such as ".[0]" or ".\0" or "(?i).0".

Теперь так и делаю...

И похоже, что AdvancedFilter работает как в цитате выше, но относительно недавно появившаяся функция REGEX в такой "преобразовательной" деятельности не замечена. Где правда?

Upd
Всё сказанное выше верно при использовании расширенного фильтра в макросе, в отличие от использования того же фильтра посредством команд меню.
« Последнее редактирование: 20 Июль 2021, 08:08 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 204


« Ответ #1: 19 Июль 2021, 08:29 »

REGEX не имеет отношения к понятию Criterion, о котором написано в справке.

И даже не только Criterion, но и Scalar, используемому в MATCH.
« Последнее редактирование: 19 Июль 2021, 10:40 от mikekaganski » Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Ответ #2: 19 Июль 2021, 19:21 »

Пытаюсь понять, откуда "ноги растут", ведь работает AdvancedFilter с рег. выражением также, как та же функция MATCH, что следует из описания выше.

Правильно это или нет, неясно. Решение выше тоже есть. Нет единообразия. Однако такая разница в работе с функцией REGEX мне непонятна. Что-то здесь не так…

Но в диапазон условий расширенного фильтра я ввожу именно критерий, как описал в стартовом сообщении.
Баг по ссылке содержит готовый пример, кому интересно.
« Последнее редактирование: 19 Июль 2021, 20:20 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 204


« Ответ #3: 19 Июль 2021, 19:26 »

Всё тут правильно.

Функция REGEX принимает строку, которая семантически является именно регулярным выражением. Функция MATCH принимает скаляр - любое одиночное значение, которое может быть интерпретировано по-разному, в том числе и как регулярка - в порядке очереди (то есть сначала проверим, не число ли это; если да - проверим набор данных на совпадение с числом; иначе перейдём к варианту "не регулярка ли это"; а если регулярки не разрешены, то наконец попробуем простое текстовое сравнение...)
« Последнее редактирование: 19 Июль 2021, 19:29 от mikekaganski » Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Ответ #4: 19 Июль 2021, 19:28 »

Михаил, тогда вопрос: расширенный фильтр работает правильно или нет?

Upd
Для фильтра я устанавливаю флаг: использовать рег. выражения. Но строка критерия подвергается преобразованию. В ячейках условий – тип данных текстовый, потому что в поле эти данные.
« Последнее редактирование: 19 Июль 2021, 19:32 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Ответ #5: 19 Июль 2021, 19:34 »

Правильно ли, разумеется, в рамках примера данных.
Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 204


« Ответ #6: 19 Июль 2021, 19:41 »

Да, правильно. Нужно только документацию поправить.
Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Ответ #7: 19 Июль 2021, 19:45 »

Ну, тогда то выше замечание для MATCH распространяется и на ряд других функций (?), а также на стандартный и расширенный фильтры, полагаю.

Upd
Как я писал, поле данных текстовое, значение в диапазоне условий для этого поля – строка с ведущим нулём. При этом строка будет преобразована в число и ноль обрезан, если не заключить его в квадратные скобки или не предварить \0

Upd2
Раньше я полагал, что если в ячейке диапазона условий я задал тип данных текстовый (иначе 0 при вводе 01 удаляется), то этого достаточно, чтобы «застолбить» критерий: что вижу, то и верно…
« Последнее редактирование: 19 Июль 2021, 20:22 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 204


« Ответ #8: 19 Июль 2021, 19:52 »

Ну, тогда то выше замечание для MATCH распространяется и на ряд других функций (?)

Непонятно, что за замечание (и чьё) распространяется на что, и что из этого следует.
Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Ответ #9: 19 Июль 2021, 20:02 »

AdvancedFilter работает также

«Предупреждение:
При использовании функций, в которых один или несколько аргументов являются строками критериев поиска, представляющими регулярное выражение, первой попыткой является преобразование строковых критериев в числа. Например, ".0" преобразуется в 0.0 и так далее. В случае успеха совпадение будет не совпадением с регулярным выражением, а числовым совпадением. Однако при переключении на язык, где десятичный разделитель не является точкой, преобразование регулярных выражений работает. Чтобы принудительно вычислить регулярное выражение вместо числового выражения, используйте какое-либо выражение, которое нельзя неправильно интерпретировать как числовое, например ".[0]" или ".\0" или "(?i).0"».

Upd
А решение проблемы – в последнем предложении.
Только одно дело – последовательно преобразовывать значение строки аргумента функции, а другое, кмк, значение в ячейке диапазона условий, тип данных которой пользователь задал явно – ТЕКСТ.
Но эта установка не принимается в расчёт.
« Последнее редактирование: 19 Июль 2021, 20:07 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 204


« Ответ #10: 19 Июль 2021, 20:06 »

Блин. Вы просто считаете ненужным писать "нужно добавить в справку ...", как написано в tdf#143438?
Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Ответ #11: 19 Июль 2021, 20:12 »

Спасибо, Михаил. Вы высказали позицию и показали, что ноги "растут оттуда". Однако я в ходе своих рассуждений допускал и другой подход, поэтому не был уверен, где правда. Как работать "с этим", мы уже знаем.
Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 648



« Ответ #12: 19 Июль 2021, 23:39 »

Я должен оговориться и уточнить суть дела.
Так, как описано выше (преобразовывает "01" в 1) AdvancedFilter работает в макросе (и именно так я использую этот фильтр), но через команды меню работает правильно иначе, то есть оставляет как есть.

Подробный анализ в примере, кому интересно.

* AdvancedFilter-test.ods (312.94 Кб - загружено 0 раз.)
« Последнее редактирование: 20 Июль 2021, 06:06 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.3.2 Community
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!