## Regex
### 头文件: `"boost/regex.hpp"`
正则表达式被封装为一个类型 `basic_regex`的对象。我们将在下一节更深入地讨论正则表达式如何被编译和分析,这里我们首先粗略地看看 `basic_regex` ,以及这个库中三个最重要的算法。
```
namespace boost {
template <class charT,
class traits=regex_traits<charT> >
class basic_regex {
public:
explicit basic_regex(
const charT* p,
flag_type f=regex_constants::normal);
bool empty() const;
unsigned mark_count() const;
flag_type flags() const;
};
typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;
}
```
### 成员函数
```
explicit basic_regex (
const charT* p,
flag_type f=regex_constants::normal);
```
这个构造函数接受一个包含正则表达式的字符序列,还有一个参数用于指定使用正则表达式时的选项,例如是否忽略大小写。如果`p`中的正则表达式无效,则抛出一个 `bad_expression` 或 `regex_error` 的异常。注意这两个异常其实是同一个东西;在写这本书之时,尚未改变当前使用的名字 `bad_expression` ,但下一个版本的Boost.Regex将会使用 `regex_error`.
```
bool empty() const;
```
这个成员函数是一个谓词,当`basic_regex`实例没有包含一个有效的正则表达式时返回 `true` ,即它被赋予一个空的字符序列时。
```
unsigned mark_count() const;
```
`mark_count` 返回`regex`中带标记子表达式的数量。带标记子表达式是指正则表达式中用圆括号括起来的部分。匹配这个子表达式的文本可以通过调用某个正则表达式算法而获得。
```
flag_type flags() const;
```
返回一个位掩码,其中包含这个`basic_regex`所设置的选项标志。例如标志 `icase`, 表示正则表达式忽略大小写,标志 `JavaScript`, 表示regex使用JavaScript的语法。
```
typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;
```
不要使用类型 `basic_regex`来定义变量,你应该使用这两个`typedef`中的一个。这两个类型,`regex` 和 `wregex`, 是两种字符类型的缩写,就如 `string` 和 `wstring` 是 `basic_string<char>` 和 `basic_string<wchar_t>`的缩写一样。这种相似性是不一样的,某种程度上,`regex` 是一个特定类型的字符串的容器。
### 普通函数
```
template <class charT,class Allocator,class traits >
bool regex_match(
const charT* str,
match_results<const charT*,Allocator>& m,
const basic_regex<charT,traits >& e,
match_flag_type flags = match_default);
```
`regex_match` 判断一个正则表达式(参数 `e`)是否匹配整个字符序列 `str`. 它主要用于验证文本。注意,这个正则表达式必须匹配被分析串的全部,否则函数返回 `false`. 如果整个序列被成功匹配,`regex_match` 返回 `True`.
```
template <class charT,class Allocator, class traits>
bool regex_search(
const charT* str,
match_results<const charT*,Allocator>& m,
const basic_regex<charT,traits >& e,
match_flag_type flags = match_default);
```
`regex_search` 类似于 `regex_match`, 但它不要求整个字符序列完全匹配。你可以用 `regex_search` 来查找输入中的一个子序列,该子序列匹配正则表达式 `e`.
```
template <class traits,class charT>
basic_string<charT> regex_replace(
const basic_string<charT>& s,
const basic_regex<charT,traits >& e,
const basic_string<charT>& fmt,
match_flag_type flags = match_default);
```
`regex_replace` 在整个字符序列中查找正则表达式`e`的所有匹配。这个算法每次成功匹配后,就根据参数`fmt`对匹配字符串进行格式化。缺省情况下,不匹配的文本不会被修改,即文本会被输出但没有改变。
这三个算法都有几个不同的重载形式:一个接受 `const charT*` (`charT` 为字符类型), 另一个接受 `const basic_string<charT>&`, 还有一个重载接受两个双向迭代器作为输入参数。
- 序
- 前言
- Acknowledgments
- 关于作者
- 本书的组织结构
- Boost的介绍
- 字符串及文本处理
- 数 据结构, 容器, 迭代器, 和算法
- 函数对象及高级编程
- 泛 型编程与模板元编程
- 数学及数字处理
- 输入/输出
- 杂项
- Part I: 通用库
- Library 1. Smart_ptr
- Smart_ptr库如何改进你的程序?
- 何时我们需要智能指针?
- Smart_ptr如何适应标准库?
- scoped_ptr
- scoped_array
- shared_ptr
- shared_array
- intrusive_ptr
- weak_ptr
- Smart_ptr总结
- Library 2. Conversion
- Conversion 库如何改进你的程序?
- polymorphic_cast
- polymorphic_downcast
- numeric_cast
- lexical_cast
- Conversion 总结
- Library 3. Utility
- Utility 库如何改进你的程序?
- BOOST_STATIC_ASSERT
- checked_delete
- noncopyable
- addressof
- enable_if
- Utility 总结
- Library 4. Operators
- Operators库如何改进你的程序?
- Operators
- 用法
- Operators 总结
- Library 5. Regex
- Regex库如何改进你的程序?
- Regex 如何适用于标准库?
- Regex
- 用法
- Regex 总结
- Part II: 容器及数据结构
- Library 6. Any
- Any 库如何改进你的程序?
- Any 如何适用于标准库?
- Any
- 用法
- Any 总结
- Library 7. Variant
- Variant 库如何改进你的程序?
- Variant 如何适用于标准库?
- Variant
- 用法
- Variant 总结
- Library 8. Tuple
- Tuple 库如何改进你的程序?
- Tuple 库如何适用于标准库?
- Tuple
- 用法
- Tuple 总结
- Part III: 函数对象与高级编程
- Library 9. Bind
- Bind 库如何改进你的程序?
- Bind 如何适用于标准库?
- Bind
- 用法
- Bind 总结
- Library 10. Lambda
- Lambda 库如何改进你的程序?
- Lambda 如何适用于标准库?
- Lambda
- 用法
- Lambda 总结
- Library 11. Function
- Function 库如何改进你的程序?
- Function 如何适用于标准库?
- Function
- 用 法
- Function 总结
- Library 12. Signals
- Signals 库如何改进你的程序?
- Signals 如何适用于标准库?
- Signals
- 用法
- Signals 总结