C++primer学習:標準ライブラリ特殊施設:正規表現ベース

7342 ワード

(1)正規表現は文字列を記述する方法であり、極めて強力な計算ツールである.c++では、REライブラリは、ヘッダファイルregexに定義正規表現ライブラリである.
regexクラスは正規表現を表し、多くの操作をサポートしているので、いくつかの例で感じてみましょう.
例(1):スペルルールでは、iがcの後に現れる限りei文字列は現れない.規則に合わない単語を正規表現でマッチングする.
string  pattern("[^c]ei");
    pattern = "[[:alpha:]]*" + pattern+"[[:alpha:]]*";
    regex r(pattern,regex::icase);
    string test_str = "receipt fresind theif receive";
    smatch ret;
     if(regex_search(test_str,results,r))
     cout<<result.str()<<endl;

===========================================
Regex反復器のタイプと一致する.前の例では、最初の一致する単語しか得られません.でもsregx_を使ってiteratorは一致するすべての単語を取得します.
string  pattern("[^c]ei");
    pattern = "[[:alpha:]]*" + pattern+"[[:alpha:]]*";
    regex r(pattern,regex::icase);
    string test_str = "receipt fresind theif receive";
    smatch ret;
    while (cin>>test_str)
    {
        for (sregex_iterator it(test_str.begin(), test_str.end(), r), end; it != end; ++it)
            cout << it->str() << "\t";
        cout << endl;
    }

サブエクスプレッションの運用
例2:電話番号のフォーマットが正しいか否かを検出する.電話番号は区番と7桁のローカル番号からなる.区番は通常かっこに入れてもいいし、入れなくてもいいです.残りの7つの数字は短い横線、1つの点、またはスペースで区切ることができますが、区切り記号を全く使わなくてもいいです.私たちは2つのステップに分けてこの問題を実現することができます.まず、電話番号の可能性のあるシーケンスを正規表現で見つけ、関数を呼び出して検証します.この検証の関数では、サブ表現が一致するか否かを判断する必要がある.
bool valid(const smatch& m)
{
    if (m[1].matched)//     
        return m[3].matched && (m[4].matched == 0 || m[4].str() == " ");
    else//      
        return !m[3].matched && (m[4].str() == m[6].str());
}

int main()
{
    string phone = "(\\()?(\\d{3})(\\))?([._ ])?(\\d{3})([._ ])?(\\d{3})";
    regex r(phone);
    string s;
    while (getline(cin, s))
    {
        for (sregex_iterator it(s.begin(), s.end(), r), end; it != end; ++it)
        {
            if (valid(*it))
                cout << "phone: " << it->str() << endl;
            else
                cout << "erro_type
"
; } } return 0; }

==========================================
例4:regex_replaceはフォーマットの置換を行うことができ、具体的には本を参照する.電話番号のフォーマットをxxxに置き換える.xxx.xxxx
fstream in("Text.txt");
string phone = "(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ])?(\\d{4})";
smatch ret;
regex r(phone);
string s,fmt("$2.$5.$7 ");
while (getline(in, s))
{
cout << regex_replace(s, r, fmt,format_no_copy) << endl;
}
return 0;

======================================================================================
例5:最初の人の電話のみを出力.
while (getline(in, s))
    {
        istringstream record(regex_replace(s, r, fmt));// record        
        record >> name;
        record >> phone_number;//       
        cout << name << "\t" << phone_number << endl;
    }

例6:電話の残りの1人に対して2番目と後ろの電話を出力.
fstream in("Text.txt");
    string phone = "(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ])?(\\d{4})";
    regex r(phone);
    string s,fmt("$2.$5.$7 ");
    string name,phone_number;

    while (getline(in, s))
    {
        istringstream record(regex_replace(s, r, fmt));// record        
        record >> name;
        cout << name << " :";//     
        vector<string> phone_num;
        size_t count;
        for (count = 0; record >> phone_number; ++count)
            phone_num.push_back(phone_number);
        if (count == 1)
            cout << phone_num[0];
        else
        for (auto it = phone_num.begin() + 1; it != phone_num.end(); ++it)
            cout << *it << " ";
        cout << endl;
    }
    return 0;
}