C++标准库为我们提供了处理字符串的正则表达式库。正则表达式是一种用于在字符串中匹配模式的微型语言。
正则表达式在查询、替换字符串的时候有很多快速的使用场景,是一个经常使用的工具。正则表达式需要使用到正则表达式的语法,这个语法是独立于编程语言外的一个工具。这个可以 在线查看和测试
菜鸟学习教程 :https://www.runoob.com/regexp/regexp-syntax.html
在线测试工具 :https://stackoverflow.org.cn/regex/
这个用到的头文件便是:
#include <regex>
1. 采用迭代器查找
// 待匹配字符串
std::string s = "Some people, when confronted with a problem";
// 正则表达式匹配对象-匹配单词
std::regex word_regex("(\\w+)");
// 获取迭代器
auto words_begin = std::sregex_iterator(s.begin(), s.end(), word_regex);
auto words_end = std::sregex_iterator();
// 总元素个数
int count = std::distance(words_begin, words_end);
// 遍历元素
for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
// 查询到的匹配对象
std::smatch match = *i;
// 输出这个匹配对象的内容
std::string match_str = match.str();
std::cout << " " << match_str << '\n';
}
/* 输出结果
Some
people
when
confronted
with
a
problem
*/
2. 使用算法查找
使用 std::regex_search() 查找
//常用
template< class BidirIt,
class Alloc, class CharT, class Traits >
bool regex_search( BidirIt first, BidirIt last,
std::match_results<BidirIt,Alloc>& m,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default );
//常用
template< class CharT, class Alloc, class Traits >
bool regex_search( const CharT* str,
std::match_results<const CharT*,Alloc>& m,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default );
//常用
template< class STraits, class SAlloc,
class Alloc, class CharT, class Traits >
bool regex_search( const std::basic_string<CharT,STraits,SAlloc>& s,
std::match_results<
typename std::basic_string<CharT,STraits,SAlloc>::const_iterator, Alloc>& m,
const std::basic_regex<CharT, Traits>& e,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default );
template< class BidirIt
class CharT, class Traits >
bool regex_search( BidirIt first, BidirIt last,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default );
template< class CharT, class Traits >
bool regex_search( const CharT* str,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default );
template< class STraits, class SAlloc,
class CharT, class Traits >
bool regex_search( const std::basic_string<CharT,STraits,SAlloc>& s,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags =std::regex_constants::match_default );
template< class STraits, class SAlloc,
class Alloc, class CharT, class Traits >
bool regex_search( const std::basic_string<CharT,STraits,SAlloc>&&,
std::match_results<typename std::basic_string<CharT,STraits,SAlloc>::const_iterator, Alloc>&,
const std::basic_regex<CharT, Traits>&,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default ) = delete;
这个函数的部分参数说明
// 待匹配字符串
std::string lines[] = {"Roses are #ff0000",
"violets are #0000ff",
"all of my base are belong to you"};
// 正则表达式对象
std::regex color_regex("#([a-f0-9]{2})"
"([a-f0-9]{2})"
"([a-f0-9]{2})");
// 匹配结果
std::vector<std::smatch> matchs;
// 简单匹配
for (const auto &line : lines) {
std::smatch m;
std::cout << line << ": " << std::boolalpha
<< std::regex_search(line, m, color_regex) << "\n";
matchs.push_back(m);
}
// 输出结果
for(auto m: matchs){
if(m.ready() && !m.empty())
std::cout << "Useful Color: " << m.str() << "\n";
}
/* 输出结果
Roses are #ff0000: true
violets are #0000ff: true
all of my base are belong to you: false
Useful Color: #ff0000
Useful Color: #0000ff
*/
这些类封装正则表达式和在字符的目标序列中匹配正则表达式的结果。
basic_regex :正则表达式对象
在源代码里面看到那个 std::regex 对象就是用这个 basic_regex 定义的
/** @brief Standard regular expressions. */
typedef basic_regex<char> regex;
sub_match :标识子表达式所匹配的字符序列
match_results:标识一个正则表达式匹配,包含所有子表达式匹配
这些算法将封装于 regex 的正则表达式应用到字符的目标序列。
regex_match:尝试匹配一个正则表达式到整个字符序列
regex_search:尝试匹配一个正则表达式到字符序列的任何部分
regex_replace:以格式化的替换文本来替换正则表达式匹配的出现位置
regex_iterator:用于遍历在序列中找到的匹配正则表达式的整个集合。
regex_iterator :迭代一个字符序列中的所有正则表达式匹配
regex_token_iterator:迭代给定字符串中的所有正则表达式匹配中的指定子表达式,或迭代未匹配的子字符串
此类定义作为异常抛出以报告来自正则表达式库错误的类型。
regex_error :报告正则表达式库生成的错误
使用这个也是非常简单的
#include <regex>
#include <iostream>
int main()
{
try {
std::regex re("[a-b][a");
}
catch (const std::regex_error& e) {
std::cout << "regex_error caught: " << e.what() << '\n';
// 这个错误码定义在 6.常量.error_type 中
if (e.code() == std::regex_constants::error_brack) {
std::cout << "The code was error_brack\n";
}
}
}
// 输出
regex_error caught: The expression contained mismatched [ and ].
The code was error_brack
regex_traits 类用于封装 regex 的本地化方面。
regex_traits:提供正则表达式库所需的关于字符类型的元信息
定义于命名空间 std::regex_constants
syntax_option_type: 控制正则表达式行为的通用选项
match_flag_type:特定于匹配的选项
error_type:描述不同类型的匹配错误,可以用 try catch 捕获
constexpr error_type error_collate = /*unspecified*/;
constexpr error_type error_ctype = /*unspecified*/;
constexpr error_type error_escape = /*unspecified*/;
constexpr error_type error_backref = /*unspecified*/;
constexpr error_type error_brack = /*unspecified*/;
constexpr error_type error_paren = /*unspecified*/;
constexpr error_type error_brace = /*unspecified*/;
constexpr error_type error_badbrace = /*unspecified*/;
constexpr error_type error_range = /*unspecified*/;
constexpr error_type error_space = /*unspecified*/;
constexpr error_type error_badrepeat = /*unspecified*/;
constexpr error_type error_complexity = /*unspecified*/;
constexpr error_type error_stack = /*unspecified*/;
名词解释如下:
常量 | 解释 |
---|---|
error_collate | 表达式含有非法对照字符名 |
error_ctype | 表达式含有非法字符类名 |
error_escape | 表达式含有非法转义字符或尾随转义 |
error_backref | 表达式含有非法回溯引用 |
error_brack | 表达式含有不匹配的方括号对( ‘[’ 与 ‘]’ ) |
error_paren | 表达式含有不匹配的括号对( ‘(’ 与 ‘)’ ) |
error_brace | 表达式含有不匹配的花括号对( ‘{’ 与 ‘}’ ) |
error_badbrace | 表达式在 {} 表达式中含有非法范围 |
error_range | 表达式含有非法字符范围(例如 [b-a] ) |
error_space | 没有将表达式转换成有限状态机的足够内存 |
error_badrepeat | *?+{ 之一不后继一个合法正则表达式 |
error_complexity | 尝试的匹配的复杂度超过了预定义的等级 |
error_stack | 没有进行匹配的足够内存 |