Игнорировать нотацию соответствия шаблону в C++11

На странице 1056 в 4-м издании языка программирования C++ Страуструп говорит, что маркер игнорирования под-шаблонов (?Однако в boost::regex это (?:, Я подозреваю, что Страуструп может ошибаться, может кто-нибудь с копией стандарта сказать?

1 ответ

Решение

Похоже, это опечатка в книге. C++11 использует синтаксис регулярных выражений ECMA, который говорит, что ?: создает группу без захвата. Эта информация на самом деле не соответствует стандарту C++.

Грамматика регулярного выражения, распознаваемая объектами basic_regex, созданными с помощью флага ECMAScript, соответствует ECMA-262, за исключением указанных ниже.

Есть некоторые исключения, но они не влияют на ваш вопрос. Вот цитата из EMCA-262

ПРИМЕЧАНИЕ 1. Скобки в форме (дизъюнкция) служат как для группировки компонентов шаблона дизъюнкции, так и для сохранения результата совпадения. Результат можно использовать либо в обратной ссылке (\, за которой следует ненулевое десятичное число), либо в ссылке на строку замены, либо в виде части массива из регулярного выражения, соответствующего внутренней процедуре. Чтобы запретить захват в скобках, используйте вместо этого форму (?: Дизъюнкция).

Другие вопросы по тегам