C++11 обратные ссылки регулярных выражений

Мне не удается использовать обратные ссылки в регулярном выражении на С++. Попробовав более эзотерические вещи, я попробовал этот простой скрипт на gcc 4.8.1:

#include <iostream>
#include <regex>
#include <string>

using namespace std;

int main() {
    regex e("(..)\\1");
    string s("aaaa");
    if (regex_match(s,e))
        cout << "match" << endl;
    return 0;
}

но это выдает ошибку времени выполнения. Я пробовал различные флаги в regex_constants, такие как ECMAScript или grep, но безрезультатно. Что не так с этим способом использования обратных ссылок в механизме регулярных выражений С++?

Просто чтобы убедиться, что я не пропустил что-то тривиальное, я попробовал это на Java.

class TestIt
{
    public static void main (String[] args) throws java.lang.Exception
    {
        final String s = "aaaa";
        final String e = "(..)\\1";
        if (s.matches(e))
            System.out.printf("match");
    }
};

и, очевидно, он печатает match, как и ожидалось, что обнадеживает.


person UndefinedBehavior    schedule 23.02.2014    source источник
comment
просто подчеркну: он пытается использовать обратные ссылки в шаблоне search, а не в шаблоне replace. это допустимо в некоторых двигателях регулярных выражений.   -  person Karoly Horvath    schedule 23.02.2014
comment
Существуют ли механизмы регулярных выражений, в которых это недействительно?   -  person UndefinedBehavior    schedule 23.02.2014
comment
Средства регулярных выражений в libstdС++ работают не полностью. Используйте boost или другую реализацию регулярных выражений, пока это не будет исправлено, или используйте libc++.   -  person n. 1.8e9-where's-my-share m.    schedule 23.02.2014
comment
Я думаю, это зависит от версии вашей библиотеки. Я попробовал ваш код на своем Mac Xcode 5.0.2, и он работал нормально.   -  person Mithrandir    schedule 23.02.2014
comment
См. также это: stackoverflow.com/questions/12530406/.   -  person Aleph    schedule 23.02.2014
comment
@Mithrandir, как я только что узнал, libc++ (который используется компилятором llvm, который, в свою очередь, используется Xcode) обеспечивает полную поддержку регулярных выражений, в то время как libstdc++ (используемый gcc) на данный момент обеспечивает только частичную поддержку.   -  person UndefinedBehavior    schedule 23.02.2014
comment
@UndefinedBehavior: ну, я думаю, придется подождать до GCC 4.9, чтобы получить полную поддержку. :-(   -  person Mithrandir    schedule 23.02.2014
comment
Работайте как положено с clang++/libc++: coliru.stacked-crooked.com/a/2d740591ad66d4ad   -  person Cubbi    schedule 24.02.2014
comment
@UndefinedBehavior: я думаю, вы можете указать это как ответ.   -  person nhahtdh    schedule 24.02.2014
comment
@nhahtdh Я сделаю это в ближайшие несколько дней.   -  person UndefinedBehavior    schedule 24.02.2014


Ответы (1)


Механизм регулярных выражений, включенный в gcc (в libstdc++), еще не полностью работает. Это регулярное выражение работает, как и ожидалось, на clang. Так что эта проблема не имеет ничего общего с тем, как C++ обрабатывает регулярные выражения; скорее это зависит от используемого компилятора.

person UndefinedBehavior    schedule 28.02.2014
comment
Можете ли вы указать номера версий GCC, в которых обратные ссылки не работают? - person einpoklum; 01.05.2016