|
|
Автор | Сообщение | Извещения об ошибках |
---|
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 25.08.10 13:35 |  |
| v. 3.09.141 windows 7 x32 при открытии панели словарей выскакивает ошибка 
 |
|
|
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 25.08.10 14:03 |  |
| после подключения словаря ошибка исчезла  наверно потому что обновлена поверх старой версии? |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 01.09.10 19:30 |  |
| 3.10.142 windows 7 x32

а если выделить и через Ctrl+T то нормально, но если через "Сервис"-"Статистика" то не работает  |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | 12.09.10 21:12 |  |
| Спасибо, что обратили мое внимание.  Это не ошибка программы. Это сообщение пользователю от модуля RegExpr. "Ошибка компиляции регулярного выражения. Операнд не может быть пустым (позиция 4)" Т.е. предложенное на обработку регулярное выражение написано неверно. + означает повторение ОДИН или больше раз того, что перед ним. Перед ним подвыражение .* означающее повторение любого символа НОЛЬ или больше раз, т.е. может и ничего не быть. Как повторить ОДИН или более раз то, чего нет?
В новой версии я отключил все такие сообщения - это добрая программистская традиция - не напрягать пользователя его же ошибками. Тот кто знаяет РВ, тот сообразит, почему некое правило не изменяет текст. Оно неверное и игнорируется. А тому, кто не знает РВ, рассказывать об ошибках бесполезно, не поймет-с.
ЗЫ. Кстати, Балаболка вышеуказанное ошибочное правило именно таким молчаливым образом и игнорирует. 
|
|
|
 | |
Lexus Эксперт
Сообщений : 413
Репутация : 32
 | 13.09.10 11:28 |  |
| - Цитата :
- В новой версии я отключил все такие сообщения - это добрая программистская традиция - не напрягать пользователя его же ошибками. Тот кто знает РВ, тот сообразит, почему некое правило не изменяет текст.
Хорошо бы иметь возможность увидеть список правил, не сработавших по причине ошибки в их синтаксисе. Не всегда бывает понятно, виновата программа, пропустившая правило,компонент, или ошибку допустил составитель. Примерно, так где-то появляется модальное окошко, или выскакивает строка сообщения, что программа проигнорировала 3 правила по причине ошибок в них имеющихся. И показыывает правила и номер строки в словаре. |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | 13.09.10 19:51 |  |
| - Код:
(.*)+(\=)+(.*)=$3 Проблема с этим правилом в том, что оно делится на левую и правую части по ПЕРВОМУ знаку равенства, а не по второму, как было задумано его составителем. Из-за этого и возникает ошибка синтаксиса.
Я всё ждал эти годы, когда найдется тот "маньяк", который в INI-словаре вставит в левую часть правила знак равенства; мне уже стало казаться, что при чтении текстов не может возникнуть такой необходимости.
Не вижу смысла и сейчас из-за одного такого случая что-то придумывать для включения знака равенства в регулярное выражение (например, записывать два знака равенства подряд, '=='). Все это замедлит загрузку/обработку словарей, затруднит их редактирование и т.д. Так что, при использовании INI-словарей в "Балаболке" в левой части правила символ '=' использовать НЕЛЬЗЯ. Разумеется, автор программы "Демагог" может самостоятельно принять решение на этот счет (даже если это окажет влияние на совместимость словарей). |
|
|
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 13.09.10 20:48 |  |
| 
- balabolka пишет:
- Я всё ждал эти годы, когда найдется тот "маньяк"
нет предела совершенству  а выход мы нашли заменив "\=" на его аналог "\x3D", работает и ладно  но если бы не попалось то наверное никто бы и не узнал, а ведь наверно есть и еще подобные грабли... |
|
|
 | |
Lexus Эксперт
Сообщений : 413
Репутация : 32
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
Lexus Эксперт
Сообщений : 413
Репутация : 32
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | 14.09.10 14:34 |  |
| Получается, проблема в символе "+" ("плюс"): в новом методе TRegExpr он вызывает ошибку, в VBScript - нет. В принципе, здесь вполне можно обойтись без "плюсов"; правило можно записать и так:
- Код:
(.*)(\x3D)(.*)=$3 Тогда правило сработает и с TRegExpr, и с VBScript. Нужен ли здесь "плюс" или нет - не знаю.
Тут другая "засада": как я понимаю, составитель этого правила хотел обработать текст ПОСТРОЧНО, то есть получить текст, стоящий после "=" на каждой строчке. Сейчас в "Балаболке" это получится лишь для VBScript:
один=первый два=второй
даст в итоге:
первый второй
А для нового метода вернется лишь это:
второй
Дело тут в модификаторе /s: символ "." совпадает с любым символом, но если выключен модификатор /s, то "." не совпадает с \x0D\x0A и \x0A и \x0D (не совпадает с переводом каретки). То есть, чтобы получить, наконец, то, что выдает для этого правила VBScript, надо внутри программы параметру TRegExpr.ModifierS присвоить значение False (сейчас в "Балаболке" это не так; изменю в следующей версии программы - чтобы обеспечить совместимость с VBScript). |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | 14.09.10 14:59 |  |
| - Цитата :
- ModifierS присвоить значение False
По-видимому, так и придется сделать - это работает.
По мере обнаружения к-л других нехороших вариантов правил можно заранее автоматичски корректировать такие правила, перед тем как передать TRegExpr'y на исполнение.
Вроде того, как оказалось вполне практичным делать в правой части правила замены вида $1n ---> ${1}n , где n - цифровой символ 0..9 Тем самым удалось избежать правок в самом TRegExpr.pas. (А на скорости выполнения предварительные замены никак не отразились). ... if VBS then right := VBSCompatible(right); ... //---------------------------------------------------------------------- function VBSCompatible(c: string): string; var k: integer; b, d: string; begin SetLength(d,5); d[1] := '$'; d[2] := '{'; b := ''; k := 1; while k > 0 do begin k := PosCh('$',c,k); {!} if k > 0 then b := Copy(c,k,3) else break; if (Length(b) = 3) and (b[2] = '1') and (b[3] in ['0'..'9']) then begin d[3] := b[2]; d[4] := '}'; d[5] := b[3]; c := StringReplace(c,b,d,[rfReplaceAll]); end; Inc(k); end; Result := c; end; //------------------------------------------------------------------------- |
|
|
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | |
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | 16.09.10 21:43 |  |
| - evilone_ пишет:
- ошибку балаболка не нашла
В синтаксисе ошибки нет, а вот по смыслу правило не совсем верное: в Windows конец строки обозначается ДВУМЯ символами, а не одним, как в Вашем примере. Так что, Ваше правило удаляет лишь ОДИН символ конца строки, но и второго оставшегося символа достаточно, чтобы разрыв строки никуда не исчез.
Вот как нужно записать это правило:
- Код:
([A-Za-zА-яЁё])(\r)(\n)=$1 Это удалит оба символа на конце строки.
- evilone_ пишет:
- и можно ли как-то озвучить полный список того что 100% не будет работать в любом из режимов ini-словарей и что только в одном из, а то полная путаница с ними, так работает а так не работает
Ничего себе у Вас запросы! я бы и сам хотел узнать мнение специалистов, работающих с регулярными выражениями каждый день, о том, какие правила будут работать, какие нет, и почему.
Пока приходится разбираться методом проб и ошибок; спасибо за помощь тем, кто редактирует словари INI и присылает информацию об ошибках. |
|
|
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 17.09.10 0:28 |  |
| - balabolka пишет:
- Вот как нужно записать это правило
у меня это правило так же не работает, разрыв строки все равно остается, не знаю почему  вот мой пример текста
|
|
|
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | 17.09.10 11:52 |  |
| evilone_ Возможно, у Вас в настройках программы "Балаболка" значение длины паузы между абзацами больше 0 (окно "Установки", закладка "Паузы"). Тогда текст делится на части по-другому (на абзацы), и Ваше правило не применяется к "стыку" двух абзацев.
Именно поэтому мной не рекомендуется применять правила, "охватывающие" более одного абзаца: INI-словарь был задуман не как инструмент для обработки текстов (так он сейчас используется некоторыми пользователями), а как словарь коррекции произношения при чтении вслух. Правила применяются не ко всему тексту целиком, а лишь к конкретной его части, которая читается в данный момент. "Стык" двух кусков текста возник бы так или иначе, в любой TTS программе; просто в "Балаболке" это сразу стало заметно из-за паузы между абзацами.
Возможно, стоит еще поразмыслить над этим. Но пока я не вижу другого способа: правила из словарей (INI и DIC) применялись и применяются к ЧАСТЯМ текста, а не к тексту целиком. Размеры этих "кусков" могут быть разными - это зависит от конкретных настроек программы (паузы, запись LRC файлов или тега Lyrics в MP3, что-то другое). |
|
|
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 17.09.10 14:41 |  |
| - balabolka пишет:
- в настройках программы "Балаболка" значение длины паузы между абзацами больше 0 (окно "Установки", закладка "Паузы")
да, вся причина оказывается была именно в этом  теперь все работает, пасиб |
|
|
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 15.10.10 20:55 |  |
| ...и еще одно
- Код:
\b(\d)(\d)(\d)(\d)(\d)\b=$10 $20 $30 $40 $50
- Код:
12345 54321
- Код:
10 50 вместо
- Код:
10 20 30 40 50 50 40 30 20 10
 |
|
|
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | |
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 16.10.10 15:04 |  |
| - Цитата :
- В обоих случаях будет получен СПИСОК ПРИМЕНЕННЫХ ПРАВИЛ. Вот в нем и посмотреть, какие еще правила, кроме упомянутых, в него затесались?
ну так написано же какое правило, нет? оно там совсем одно  подстановки вида $20-$50 игнорируются, и только в демагоге кстати с остальным уже разобрались
- Цитата :
- И это правило сработало так, как Вы задумывали
у меня в демагоге с включенной совместимостью для старого метода получается только 10 и 50 или я что-то делаю не так? |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 01.09.13 14:46 |  |
| столкнулись с неточностью при работе с *.rex словарем в программе demagog - если есть правила:- Код:
(\bвс)е(\s(\bвздор\.))=$1<:yo:>$2 <\:yo\:>=ё и текст- Код:
все вздор. замена не срабатывает, причем если сделать правило- Код:
[в]=ё то получается- Код:
все вздоС‘. что мы делаем не так? |
|
|
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 04.09.13 23:21 |  |
| - flegont пишет:
- Я подозреваю, что первоначальный тест был проведен на более полном словаре, содержащим и другие правила, кроме упомянутых трех. Вот среди тех "других", по-видимому, и кроется нечто сомнительное...
угу, это правило входит в более полный словарь и пример был подобран специально для него, но у нас почему-то один и тот же словарь работает по-разному в разных программах, точнее где-то работает а где-то нет 
- Спойлер:
-
 словарь отсюдатекст в примере: - Цитата :
- Довольно, и далее, я уверен, все вздор.
|
|
|
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | 05.09.13 1:11 |  |
| evilone_ Полагаю, дело тут в том, что файл "YOhmg.rex", который Вы используете в тестах, имеет кодировку UTF-8 ("Балаболка" сохраняет все словари в этой кодировке). А программа "Демагог" предполагает, что словарь имеет кодировку ANSI. |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 05.09.13 21:26 |  |
| flegont, balabolka, ой, действительно все дело было в кодировке... спасибо  |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
basist Гость
 | basist | :: 12.01.14 19:26 |
12.01.14 19:26 |  |
| Текст- Цитата :
- абаках=абАках,абакАх
абаке=абАке,абакЕ абаки=абАки,абакИ абакой=абАкой,абакОй абакою=абАкою,абакОю , шаблон- Код:
([А-Яа-я/-]+=)([А-Яа-я\-]+,)([А-Яа-я\-]+) , правило- Код:
$1$2 $1$3 . Включена радиокнопка "Шаблон регулярные выражения". Когда нажимаешь "Найти дальше" и "Заменить" - работает, когда "Заменить всё" - не работает. Создал словарь *.rex с правилом выше, не функционирует. Замен требуется много, каким может быть решение?
|
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | 15.01.14 9:19 |  |
| basist, спасибо за Ваше сообщение!
Исправьте Ваш словарик вот так:
([А-Яа-я\-]+\x3d)([А-Яа-я\-]+\,)([А-Яа-я\-]+)=$1$2 $1$3
Дело здесь вот в чем. В окне поиска-замены по кнопке "Заменить всё" программа как раз и составляет (молча и тайно) временный словарик и по нему производит сразу все замены. Поскольку ничего не заменилось, то я по Вашему примеру сделал отдельный словарик с этой заменой. При попытке посмотреть словарную замену по клавише Ctrl+T сразу получил уведомление программы: "Некорректное регулярное выражение".
А потом уже увидел ошибку  Программа всегда разделяет словарную строку на ПРАВИЛО и ЗАМЕНУ по первому знаку равенства в словарной строке. (Кажется, Балаболка работает точно так же). В нашем случае, первый знак равенства - это просто ИСКОМЫЙ СИМВОЛ в тексте. От этого и все беды - правило и замена определились неверно.
Решение. Запишем первый символ = в виде шестнадцатеричного кода: \x3d Таким образом, проблема будет решена. Соответственно, при работе через окно поиска-замены правило поиска надо указывать в виде: ([А-Яа-я\-]+\x3d)([А-Яа-я\-]+\,)([А-Яа-я\-]+) Тогда кнопка "Заменить всё" отработает нормально.
Есть альтернативное решение для пользовательских словарей, но оно годится только для Demagog'a. Использовать альтернативный разделитель словарной строки на правило и замену - двойное двоеточие ::
([А-Яа-я\-]+\=)([А-Яа-я\-]+\,)([А-Яа-я\-]+)::$1$2 $1$3
|
|
|
 | |
balabolka V.I.P.
Сообщений : 1212
Репутация : 986
 | 15.01.14 11:03 |  |
| В "Балаболке" знак "=" в регулярных выражениях также следует записывать как "\=" (не помню, когда именно это поправил, но уже достаточно давно). Но и "\x3d" также будет работать. |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | 15.01.14 12:25 |  |
| - Цитата :
- знак "=" в регулярных выражениях также следует записывать как "\="
Хорошая мысль. Также поправил (версия 271) 
Теперь вот это работает:
([А-Яа-я\-]+\=)([А-Яа-я\-]+\,)([А-Яа-я\-]+)=$1$2 $1$3
|
|
|
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | |
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 18.01.14 14:03 |  |
| наверно лучше всего просто добавить поддержку \xXX для ASCII и \uХХХХ для Unicode в замене, а по необходимости все эти \r\n\t и т.п. можно будет записать в шестнадцатеричном представлении  а кстати, планируется ли переход\поддержка Unicode в Demagog? |
|
|
 | |
flegont V.I.P.
Сообщений : 355
Репутация : 475
 | |
 | |
evilone_ Участник «online словари»
Сообщений : 860
Репутация : 317
 | 20.01.14 21:11 |  |
| - flegont пишет:
- А какие аргументы "за"?
ну так чтобы чего-то очень не хватало то нет, наверно только поддержка других языков которые не поддерживает ASCII - но оно и не так часто надо... словари - наше все это главное |
|
|
 | |
|
Извещения об ошибках |
---|