Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

FAQ

Boost , Boost.Regex 5.1.2 , Background Information

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

FAQ

Q.Я не могу заставить регекс++ работать с персонажами побега, что происходит?

A.Если вы встраиваете регулярные выражения в код C++, то помните, что убегающие символы обрабатываются дважды: один раз компилятором C++ и один раз Boost. Компилятор выражений Regex, чтобы передать обычное выражение \d+ в Boost. Regex, вы должны встроить «\d+» в свой код. Точно так же, чтобы соответствовать буквальному ответному удару, вам нужно будет вставить «\\» в свой код.

Q.Независимо от того, что я делаю, regex_match всегда возвращается ложным, что происходит?

А.Алгоритм regex_match добивается успеха только в том случае, если выражение соответствуетвсемутексту, если вы хотитенайтиподстроку в тексте, которая соответствует выражению, то вместо этого используйте regex_search.

Q.Почему использование скобки в обычном выражении POSIX изменяет результат совпадения?

А.Для POSIX (расширенных и основных) регулярных выражений, но не для perl-регексов, скобки не только маркируют; они определяют, что лучше всего подходит. Когда выражение компилируется в виде базового или расширенного регекса POSIX, оно увеличивается. Regex следует стандартному правилу POSIX для определения соответствия. Таким образом, если после рассмотрения всего выражения существует более одного возможного совпадения, оно выглядит следующим на первом подвыражении, а затем на втором подвыражении и так далее. Так что...

"(0*)([0-9]*)" против "00123" даст $1 = "00" $2 = "123"

где

"0*([0-9])*" против "00123" даст $1 = "00123"

Если вы подумаете об этом, если бы 1 доллар соответствовал «123», это было бы «менее хорошо», чем матч «00123», который находится как дальше налево, так и дольше. Если вы хотите, чтобы 1 доллар соответствовал только части «123», то вам нужно использовать что-то вроде:

"0*([1-9][0-9]*)"

как выражение.

Q.Почему диапазоны символов не работают должным образом (только в режиме POSIX)?

А.Стандарт POSIX определяет, что выражения диапазона символов чувствительны к локализации, поэтому, например, выражение [A-Z] будет соответствовать любому коллатеральному элементу, который коллатирует между 'A' и 'Z'. Это означает, что для большинства локаций, отличных от «C» или «POSIX», A-Z будет соответствовать одному символу «t», например, который не соответствует ожиданиям большинства людей. По этой причине поведение Boost по умолчанию. Регекс (режим Perl) заключается в выключении локального чувствительного коллационирования, не устанавливая<regex_constants::collate>флаг времени компиляции. Однако если вы установите флаг времени компиляции без по умолчанию, например<regex_constants::extended>или<regex_constants::basic>, то будет включена локальная зависимая коллаляция, это также относится к функциям API POSIX, которые используют либо<regex_constants::extended>, либо<regex_constants::basic>внутренне. [Примечание - когда<regex_constants::nocollate>в действительности, библиотека ведет себя "как если бы" категория LC_COLLATE locale всегда была "С", независимо от того, что она фактически установила - конечное примечание].

Q.Почему нет никаких спецификаций на какую-либо из функций? Какие исключения может сделать библиотека?

А.Не все компиляторы поддерживают (или поддерживают) спецификации, другие поддерживают их, но с пониженной эффективностью. Спецификации броска могут быть добавлены позже, так как компиляторы начинают работать лучше. Библиотека должна выбрасывать только три типа исключений: [boost::regex_error] может быть брошен<basic_regex>при составлении регулярного выражения,<std::runtime_error>может быть брошен, когда вызов<basic_regex::imbue>пытается открыть каталог сообщений, которого не существует, или когда вызов<regex_search>или<regex_match>приводит к «вечному» поиску, или когда вызов<RegEx::GrepFiles>или<RegEx::FindFiles>пытается открыть файл, который не может быть открыт, наконец<std::bad_alloc>может быть брошен почти любой из функций в этой библиотеке.

Q.Почему я не могу использовать «удобные» версии regex_match/regex_search/regex_grep/regex_format/regex_merge?

А.Эти версии могут быть или не быть доступны в зависимости от возможностей вашего компилятора, правила, определяющие формат этих функций, довольно сложны - и в помощь приведены только версии, видимые стандартному компилятору. Чтобы узнать, что поддерживает ваш компилятор, запуститечерез препроцессор C++ и найдите выходной файл для интересующей вас функции. Обратите внимание, что очень немногие современные компиляторы все еще имеют проблемы с этими перегруженными функциями.


PrevUpHomeNext

Статья FAQ раздела Boost.Regex 5.1.2 Background Information может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Background Information ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:09:14/0.023774862289429/1