C++primer学習:標準ライブラリ特殊施設:正規表現ベース
7342 ワード
(1)正規表現は文字列を記述する方法であり、極めて強力な計算ツールである.c++では、REライブラリは、ヘッダファイルregexに定義正規表現ライブラリである.
regexクラスは正規表現を表し、多くの操作をサポートしているので、いくつかの例で感じてみましょう.
例(1):スペルルールでは、iがcの後に現れる限りei文字列は現れない.規則に合わない単語を正規表現でマッチングする.
===========================================
Regex反復器のタイプと一致する.前の例では、最初の一致する単語しか得られません.でもsregx_を使ってiteratorは一致するすべての単語を取得します.
サブエクスプレッションの運用
例2:電話番号のフォーマットが正しいか否かを検出する.電話番号は区番と7桁のローカル番号からなる.区番は通常かっこに入れてもいいし、入れなくてもいいです.残りの7つの数字は短い横線、1つの点、またはスペースで区切ることができますが、区切り記号を全く使わなくてもいいです.私たちは2つのステップに分けてこの問題を実現することができます.まず、電話番号の可能性のあるシーケンスを正規表現で見つけ、関数を呼び出して検証します.この検証の関数では、サブ表現が一致するか否かを判断する必要がある.
==========================================
例4:regex_replaceはフォーマットの置換を行うことができ、具体的には本を参照する.電話番号のフォーマットをxxxに置き換える.xxx.xxxx
======================================================================================
例5:最初の人の電話のみを出力.
例6:電話の残りの1人に対して2番目と後ろの電話を出力.
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;
}