Программирование. Принципы и практика использования C++ Исправленное издание, стр. 324
if (boost::regex_search(line, matches, pat))Мы используем реализацию библиотеки
Boost.RegexBoost.RegexBoost.Regexboostboost::regexВернемся к регулярным выражениям! Рассмотрим следующий фрагмент кода:
boost::regex pat ("\\w{2}\\s*\\d{5}(–\\d{4})?");cout << "шаблон: " << pat << '\n';Здесь мы сначала определили шаблон
patregex\\w{2}\\s*\\d{5}(–\\d{4})?
Если бы вы запустили программу, то увидели бы на экране следующую строку:
pattern: \w{2}\s*\d{5}(–\d{4})?
В строковых литералах языка С++ обратная косая черта означает управляющий символ (раздел A.2.4), поэтому вместо одной обратной косой черты (\) в литеральной строке необходимо написать две (\\).
regexstring<<regexstringregexregexboost::smatch matches;if (boost::regex_search(line, matches, pat)) cout << lineno << ": " << matches[0] << '\n';
regex_search(line, matches, pat) linepatmatchesregex_search(line, matches, pat)falseПеременная
matchessmatchssmatchmatches[0]matches[i]i<matches.size()Nmatches.size()==N+1
matches.size()==2while (getline(in,line)) { boost::smatch matches; if (boost::regex_search(line, matches, pat)) { cout << lineno << ": " << matches[0] << '\n'; // полное // совпадение if (1<matches.size() && matches[1].matched) cout << "\t: " << matches[1] << '\n'; // частичное // совпадение }}Строго говоря, мы не обязаны проверять выражение
1<matches.size()patmatchedmatches[1].matchedmatches[i].matchedfalsematches[i]matches[17]Мы применили нашу программу к файлу, содержащему следующие строки:
address TX77845
ffff tx 77843 asasasaa
ggg TX3456–23456
howdy
zzz TX23456–3456sss ggg TX33456–1234
cvzcv TX77845–1234 sdsas
xxxTx77845xxx
TX12345–123456
Результат приведен ниже.
pattern: "\w{2}\s*\d{5}(–\d{4})?"
1: TX77845
2: tx 77843
5: TX23456–3456
: –3456
6: TX77845–1234
: –1234
7: Tx77845
8: TX12345–1234