Как я могу поддерживать вычитание классов символов регулярных выражений с помощью регулярных выражений C++?

Я не знаю, кто закрыл этот вопрос, но, пожалуйста, прочитайте вопрос... Это законная проблема, и у меня есть провел большое количество исследований в Интернете и не может найти способ реализовать это на С++. Я могу только предположить, что тот, кто закрыл вопрос, не читал его. (Они не указали причину закрытия вопроса, поэтому, если вы собираетесь закрыть его снова, объясните, почему.)

Я пишу программу на C++, которая должна принимать регулярные выражения, определенные в файле схемы XML, и использовать их для проверки данных XML. Проблема в том, что разновидность регулярных выражений, используемых XML-схемами, похоже, не поддерживается напрямую в C++.

Например, есть пара специальных классов символов \i и \c, которые не определены по умолчанию, а также язык регулярных выражений XML-схемы поддерживает нечто, называемое вычитание класса символов, которое, похоже, не поддерживается в C++.

Разрешить использование специальных классов символов \i и \c довольно просто, я могу просто найти \i или \c в регулярном выражении и заменить их их расширенными версиями, но заставить работать вычитание классов символов — гораздо более сложная проблема. ...

Например, это регулярное выражение, допустимое в определении XML-схемы, вызывает исключение в C++, говорящее о несбалансированных квадратных скобках.

#include <iostream>
#include <regex>

int main()
{
    try
    {
        // Match any lowercase letter that is not a vowel
        std::regex rx("[a-z-[aeiuo]]");
    }
    catch (const std::regex_error& ex)
    {
        std::cout << ex.what() << std::endl;
    }
}

Как я могу заставить С++ распознавать вычитание класса символов в регулярном выражении? Или, что еще лучше, есть ли способ просто использовать разновидность XML-схемы регулярных выражений непосредственно в C++?


person tjwrona1992    schedule 09.03.2021    source источник
comment
Я думаю, что ваш вопрос совершенно правильный (хотя ответ, вероятно, не поддерживается). Тег [regex] действителен и для этого вопроса, однако простое добавление этого тега может закрыть ваш вопрос. Пожалуйста, не добавляйте этот тег обратно. На самом деле, я бы настоятельно рекомендовал не добавлять тег [regex] к любому вопросу на SO.   -  person cigien    schedule 09.03.2021
comment
Я понимаю, что этот вопрос специально не ищет синтаксическую ошибку в регулярном выражении, но это определенно вопрос непосредственно о регулярных выражениях, поэтому применяется тег regex. (если только у меня нет полного непонимания того, как должны использоваться теги)   -  person tjwrona1992    schedule 09.03.2021
comment
Поскольку ваш исходный вопрос был повторно открыт, вы можете закрыть этот вопрос как дубликат.   -  person cigien    schedule 11.03.2021
comment
Спасибо @cigien :) Теперь, когда я назначил награду за исходный вопрос, я стал намного ближе к поиску надежного решения.   -  person tjwrona1992    schedule 11.03.2021


Ответы (1)


Я никогда не слышал о вычитании класса символов, но если вам нужна строчная буква, не являющаяся гласной, вы можете достаточно легко выразить это с помощью обычного класса символов:

std::regex rx("[a-df-hj-np-t-v-z]");
person Tim Biegeleisen    schedule 09.03.2021
comment
Проблема в том, что строка, содержащая регулярное выражение, будет предоставлена ​​пользователем, и мне нужно поддерживать предоставленные пользователем строки регулярных выражений, которые используют вычитание классов символов, потому что этого требует спецификация регулярных выражений для определений схемы XML... Вот почему это так расстраивает, ха-ха. Я бы просто использовал альтернативную строку шаблона, если бы мог. Я начинаю думать, что мне, возможно, придется перенести мои регулярные выражения на другой язык, который поддерживает это. Я думаю, что у Python может быть разновидность регулярных выражений, которая поддерживает это. - person tjwrona1992; 09.03.2021