2

XML スキーマ ファイルで定義されている正規表現を取得し、それらを使用して XML データを検証する必要がある C++ プログラムを作成しています。問題は、XML スキーマで使用される正規表現のフレーバーが C++ で直接サポートされていないように見えることです。

たとえば、デフォルトでは定義されていない特殊な文字クラスがいくつかあります。また、XML スキーマの正規表現言語は、C++ ではサポートされていないように見える「文字クラスの減算」と呼ばれるもの\iをサポートしています\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;
    }
}

C++ に正規表現内の文字クラスの減算を認識させるにはどうすればよいですか? または、さらに良いことに、C++ 内で直接正規表現の XML Schema フレーバーを使用する方法はありますか?

4

4 に答える 4

1

(Cライブラリです)のように、 XPathをサポートするライブラリのライブラリ関数を使用してみてください。XML正規表現を処理してXMLに直接適用できますxmlregexplibxml

http://www.xmlsoft.org/html/libxml-xmlregexp.html#xmlRegexp

----> http://web.mit.edu/outland/share/doc/libxml2-2.4.30/html/libxml-xmlregexp.html <----

代替手段は PugiXML (C++ ライブラリ、 どの XML パーサーを C++ で使用する必要がありますか? ) である可能性がありますが、XML 正規表現機能を実装していないと思います...

于 2021-03-14T12:21:00.763 に答える