16

こんにちは、私は正規表現が初めてで、c++ リファレンス Web サイトから理解した内容から、一致結果を取得することができます。

私の質問は、これらの結果を取得するにはどうすればよいですか? smatchとはどう違いcmatchますか?たとえば、日付と時刻で構成される文字列があり、これは私が書いた正規表現です。

"(1[0-2]|0?[1-9])([:][0-5][0-9])?(am|pm)"

文字列と上記の式でa を実行するregex_searchと、文字列に時間が含まれているかどうかを確認できます。しかし、時間と分を分離できるように、その時間を構造体に保存したいと考えています。Visual Studio 2010 C++ を使用しています。

4

2 に答える 2

22

eg を使用すると、 を使用して一致した文字列を取得できる場所がstd::regex_search埋められます。std::match_resultoperator[]

編集:プログラム例:

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

void test_regex_search(const std::string& input)
{
    std::regex rgx("((1[0-2])|(0?[1-9])):([0-5][0-9])((am)|(pm))");
    std::smatch match;

    if (std::regex_search(input.begin(), input.end(), match, rgx))
    {
        std::cout << "Match\n";

        //for (auto m : match)
        //  std::cout << "  submatch " << m << '\n';

        std::cout << "match[1] = " << match[1] << '\n';
        std::cout << "match[4] = " << match[4] << '\n';
        std::cout << "match[5] = " << match[5] << '\n';
    }
    else
        std::cout << "No match\n";
}

int main()
{
    const std::string time1 = "9:45pm";
    const std::string time2 = "11:53am";

    test_regex_search(time1);
    test_regex_search(time2);
}

プログラムからの出力:

マッチ
マッチ[1] = 9
マッチ[4] = 45
マッチ[5] = 午後
マッチ
マッチ[1] = 11
マッチ[4] = 53
マッチ[5] =午前
于 2012-10-16T06:17:43.903 に答える
1

名前付きグループを使用するだけです。

(?<hour>(1[0-2]|0?[1-9]))([:](?<minute>[0-5][0-9]))?(am|pm)

わかりました、vs2010 は名前付きグループをサポートしていません。名前のないキャプチャ グループを既に使用しています。それらを通過します。

于 2012-10-16T06:17:44.447 に答える