Обсуждение:regex - регулярные выражения
5 (1)
Обсуждение:regex - регулярные выражения ( Обсуждение примера 02.04.2008 22:41 )
3(2)поиск в строке с использованием регулярных выражений на основе библиотеки
boost.
версия 0.4.1 (05.12.2015 20:52)
r=boostre_match(strRE, strStr, strErr, aMatch);
strRE
Строка с шаблоном регулярного выражения.
strStr
Строка в которой будет производиться поиск.
strErr
Строка в которую будет возвращено сообщение об ошибке.
aMatch
Объект TArray в котором будут сохранены найденные паттерны из (...).
r
0 - не соответствует шаблону
>0 - соответствует шаблону
-1 - ошибка
r=boostre_match_2(aRE|strRE, strStr, strErr, aMatch, strMode, aExtraMatch);
В качестве первого паратера может передаваться или строка или TArray()
strRE
Строка с шаблоном регулярного выражения. При соответствии шаблона код
возврата будет равен 0.
aRE
Объект TArray() элементами которого являюттся строки с шаблоном
регулярного выражения. Индекс шаблона, которому соответствует строка
будет возвращен функцией. Шаблоны проверяются от 0 до первого
совпавшего, дальнейшая проверка не производится. В случае указания
опции "a". Поведение меняется.
strStr
Строка в которой будет производиться поиск.
strErr
Строка в которую будет возвращено сообщение об ошибке.
aMatch
Объект TArray в котором будут сохранены найденные паттерны из (...).
strMode
Строка с опциями. Строка, состоящая из символов, соответствующих
опциям проверки шаблона. Неизвестные игнорируются.
Опции:
i - Проверка без учета регистра.
x - eXtra match (Repeated Captures)
m - match, not search. Строка должна целиком соответствовать
регулярному выражению
a - all. Поиск всехвхождений. В этом случае в aRE возвращается массив
массивов. Головной массив соответствует найденным вхождениям
релярного выражения в строке. А уже элементами головного массива
являются массивы найденных групп (скобок). Если надена опция "a",
то опции "x" и "m" игнорируются
aExtraMatch
Объект TArray в котором будут возвращены повторяющиеся вхождения при
включенной опции 'x'. Каждому паттерну из aMatch будет соответствовать
массив повторяющих вхождений в aExtraMatch. Т.е. в aExtraMatch будет
столько же элементов, сколько в aMatch, но каждым элементом будет
массив, элементами которого будут уже строки.
r
=>0 - индекс элемента массива шаблонов, которому первому соотетствует
строка
-1 - не соответствует ни одному шаблону
-2 - ошибка
r=boostre_replace(sRE, sFmt, sStr, strErr);
Поиск и замена с применением регулярных выражений
sRE
Строка с регулярным выражением.
sFmt
Строка с заменой.
sStr
Строка в которой производится поиск
strErr
Строка в которую будет возвращено сообщение об ошибке.
r
Возвращаеия строка с произведёнными заменами или пустая строка при ошибках в параметрах.
Описание синтаксиса регулярных выражений
original http://www.boost.org/doc/libs/1_59_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html
на русском http://www.solarix.ru/for_developers/api/regex.shtml
Русский
Библиотека использует локаль текущего юзера. RSL обычно выполняется
под сервером приложений. Он может крутиться под System или под
отдельным пользователем, но профиль этого пользователя не загружается
и настройки берутся из HKEY_USERS\.DEFAULT. В общем, если у вас вдруг
"ч" не буква, то курить локаль.
Посмотреть пример
>> ОтветитьКласс! (-) ( utkin 07.04.2008 17:49 )
5(1)Not specified
>> ОтветитьВерсия 0.1 ( tema 06.05.2008 17:28 )
5(1)Приятная вещь, но... (вниманию Кубрина) (+) ( sokols 04.06.2008 12:15 )
5(1)Тут уже не к автору, а к Кубрину просьба/предложение/замечание. Жутковато выглядит в РСЛ регэксп - из-за того, что необходимо использовать двойной обратный слэш. Нет ли возможности сделать в РСЛ синтаксис типа "here doc" из PHP, где текст, написанный между некоторыми ограничителями воспринимается буквально? Т.е. так (пример из PHP):
echo <<<EndOfs1 strRE = "^([\s|\d]\d\.\d\d\.\d\d\d\d)\s" + "([\s|\d]\d:\d\d\:\d\d)\s+" + "(\d+)\s+(\w+\.?)\s+(\w+)\s+(.*" + acc + ".?)\s+(.+)"; EndOfs1;
А то мне недавно вот такой регэксп пришлось написать, а представьте его с удвоенными слэшами :-(
Или вариант: в качестве ограничителей строк ввести дополнительно одинарные кавычки, строка между которыми воспринималась бы интерпретатором несколько по-другому (опять же PHP).
>> ОтветитьБанально хранить во вне ( в текстовом файле, базе данных, реестре RS-Bank'а) (-) ( tema 04.06.2008 12:59 )
3(2)Not specified
>> ОтветитьМожно, как вариант, но хочется, чтобы код был в одном месте, под рукой - так удобнее ( sokols 04.06.2008 13:07 )
5(1)Not specified
>> Ответить
Обновлена версия. Добалена поддержка Repeated Captures ( tema 13.11.2008 16:30 )
5(1)Not specified
>> Ответитьисходники ( amiheev 15.01.2010 10:19 )
5(1)А можно в архив добавить исходники boost/regex.hpp?
>> Ответить
Обновлена сборка. Добавлен поиск всех вхождений. ( tema 02.11.2015 10:49 )
5(1)Пересобрано со свежей версией boost, компилятор заменён на MSVC
>> ОтветитьОбновлена сборка. Добавлена функция boostre_replace ( tema 05.12.2015 21:49 )
5(1)Not specified
>> ОтветитьОбновлена сборка. ( tema 22.01.2016 00:22 )
5(1)Перенося ассоциативные массивы на boost, заодно пересобрал boostre с новой версией boost. Изменений функиональности не было. Если всё работало, то лучше не менять :)
>> ОтветитьНе запускаются примеры ( ST73 05.02.2016 10:58 )
5(1)Положил boostre.d32 к остальным библиотекам. При запуске примеров RS-Bank 5.5.003.69 падает.
>> ОтветитьТа сборка, которая сейчас на сайте? ( tema 05.02.2016 11:36 )
5(1)Да, любой. ( ST73 05.02.2016 11:41 )
5(1)Not specified
>> ОтветитьКинул в почту предыдущую сборку. ( tema 05.02.2016 12:29 )
5(1)Я, прямо, растерялся. Один и тот же RS. Другие модули не должны влиять, если они не импортируются. Зависимость только winapi. я эту библиотеку использую в куче проектов, на СП винды разные и x32 и x64.
>> ОтветитьПочта не проходит ( tema 05.02.2016 12:34 )
5(1)maildir delivery failed: Sorry, the user's maildir has
overdrawn his diskspace quota, please try again later.
Размер вложения был ~150Kb
>> ОтветитьПопробуйте на TkachenkoS@maykopbank.ru ( ST73 05.02.2016 14:43 )
5(1)Not specified
>> ОтветитьПопробовал новую версию. Тоже падает. ( ST73 05.02.2016 17:29 )
5(1)Может нужны какие-то библиотеки от Visual Studio? И еще машина под Windows XP.
>> ОтветитьОна не новая, она старее ( tema 05.02.2016 17:52 )
5(1)Посмотрю на досуге зависимости. Максимум что может потребоваться, это vcredist.
Какая машина под XP? СП???
Если терминал, то глубоко пофигу, на терминале ничего не задействуется.
>> ОтветитьНа работе у меня нет возможности запустить настоящий RS под XP ( tema 06.02.2016 12:48 )
5(1)Дома поставил в виртуалку голую XP, на неё RS-Forms.
Падает :( Версии 4 и старше, котрые собирались под MSVC валятся. До 3, которые на Борланде работают.
Будем искать.
>> ОтветитьРабота над ошибками. ( tema 07.02.2016 21:19 )
5(1)Падение происодило в консрукторе класса. В этот момент происходила компиляция регулярного выражения. За разумное время я не разобрался где в booste возникает ошибка и какими опциями компилятора можно её победить.
Пересобранная под VC10 под XP библиотека не страдала падучей, и в дитрибутив был добавлен файл boostre.vc10.d32, эта тот же самый код, собранный под старым компилятором и работающий под WinXP.
>> ОтветитьЭта версия работает. ( ST73 08.02.2016 11:46 )
5(1)Not specified
>> ОтветитьБольшое спасибо! ( ST73 08.02.2016 11:46 )
5(1)Not specified
>> ОтветитьТема с WinXP осталась нераскрытой :) ( tema 08.02.2016 11:59 )
5(1)Просто любопытно.
вы в двухзвенке работаете?
или у вас сервер приложений на XP?
или есть какой-то макрос, который на терминале отрабатывает.
>> ОтветитьРаботаем в трехзвенке. ( ST73 08.02.2016 14:58 )
5(1)Сервер совмещенный под Win 2003 x64 - английской. В двухзвенке я сразу пробовал - падает. Сейчас в двухзвенке тоже нормально работает.
>> Ответить
Появились конкуренты в лице RS :) ( tema 05.03.2019 22:06 )
5(2)Перечитывая в очередной раз свою любимую книгу
ПРОБЛЕМНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК RSL
РУКОВОДСТВО ПРОГРАММИСТА
обнаружил, что RS запилил свою dlm-ку с регулярками. Видать, западло им было юзать чужую :)
Решил быстренько побенчить, можно ли ей пользоваться.
import "rslstring.d32";
import KvitInter;
var strRE="(\\d+)";
var aMatch=TArray();
var str;
var i,N=10000;
var time_start=time();
for (i,1,N,1)
CreateGUID(str);
RslRegexSearch (strRE, str, null, aMatch);
end;
PrintLN(time()-time_start);
При 10К отработало за секунду, при 100К за 4 секунды, при миллионе не дождался результата.
Но если перед вызовом функции принудительно чистить массив, то отрабатывет за 8 секунд.
Моя сборка регулярок из буста показала 11 секунд на миллионе.
import KvitInter;
import boostre;
var str;
var i,N=1000000;
var time_start=time();
for (i,1,N,1)
CreateGUID(str);
boostre_match(strRE, str, null, aMatch);
end;
PrintLN(time()-time_start);
В итоге: обе работают быстро, но дистрибутив быстрее. И не забывайте кормить её свежими массивами.
>> Ответить