Boost.Regex
正则表达式是解决大量模式匹配问题的基础。它们常用于处理大的字符串,子串模糊查找,按某种格式tokenize字符串,或者是基于某种规则修改字符串。由于C++没有提供正则表达式支持,使得有些用户被迫转向其它支持正则表达式的语言,如Perl, awk, 和 sed。Regex提供了高效和强大的正则表达式支持,基于与STL同样的前提而设计,这使得它很容易使用。Regex已被即将发布的Library Technical Report接受。
Regex库如何改进你的程序?
在文本处理中常常会用到正则表达式。例如,有很多验证有效性的工作适合使用正则表达式。考虑一个应用程序,它要求输入只由数字组成。而另一个程序可能要求一种特殊的格式,如三个数字,后跟一个字母,再后跟两个数字。你可能要验证邮政编码、信用卡号码、社会保险号码,或者其它东西;使用正则表达式来做这些验证是很简单的。另外一个可以使用正则表达式的地方是文本替换,即用某些文本替换掉另一些文本。假如你需要在很多文档中将单词colour 转换为 color。正则表达式提供了最好的方法来做这个工作,包括同时记住替换 Colour 和 COLOUR, 以及复数形式的 colours, 动词 colourize, 等等。还有一个可以使用正则表达式的地方就是,格式化文本。
许多流行的编程语言,Perl是其中一例,都内建了对正则表达式的支持,但在C++里没有。C++标准在提到正则表达式时也保持了沉默。Boost.Regex是一个非常完善并有效的库,它将正则表达式并入了C++程序,并且它包含了Perl, grep和Emacs等常见工具所使用的几种不同语法。它是最著名的C++正则表达式库之一,既容易使用又异常强大。
Regex 如何适用于标准库?
成员函数
这个构造函数接受一个包含正则表达式的字符序列,还有一个参数用于指定使用正则表达式时的选项,例如是否忽略大小写。如果p中的正则表达式无效,则抛出一个 bad_expression 或 regex_error 的异常。注意这两个异常其实是同一个东西;在写这本书之时,尚未改变当前使用的名字 bad_expression ,但下一个版本的Boost.Regex将会使用 regex_error.
这个成员函数是一个谓词,当basic_regex实例没有包含一个有效的正则表达式时返回 true ,即它被赋予一个空的字符序列时。
mark_count 返回regex中带标记子表达式的数量。带标记子表达式是指正则表达式中用圆括号括起来的部分。匹配这个子表达式的文本可以通过调用某个正则表达式算法而获得。
返回一个位掩码,其中包含这个basic_regex所设置的选项标志。例如标志 icase, 表示正则表达式忽略大小写,标志 JavaScript, 表示regex使用JavaScript的语法。
不要使用类型 basic_regex来定义变量,你应该使用这两个typedef中的一个。这两个类型,regex 和 wregex, 是两种字符类型的缩写,就如 string 和 wstring 是 basic_string<char> 和 basic_string<wchar_t>的缩写一样。这种相似性是不一样的,某种程度上,regex 是一个特定类型的字符串的容器。
普通函数
regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。注意,这个正则表达式必须匹配被分析串的全部,否则函数返回 false. 如果整个序列被成功匹配,regex_match 返回 True.
regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。你可以用 regex_search 来查找输入中的一个子序列,该子序列匹配正则表达式 e.
regex_replace 在整个字符序列中查找正则表达式e的所有匹配。这个算法每次成功匹配后,就根据参数fmt对匹配字符串进行格式化。缺省情况下,不匹配的文本不会被修改,即文本会被输出但没有改变。
这三个算法都有几个不同的重载形式:一个接受 const charT* (charT 为字符类型), 另一个接受 const basic_string<charT>&, 还有一个重载接受两个双向迭代器作为输入参数。
正则表达式是解决大量模式匹配问题的基础。它们常用于处理大的字符串,子串模糊查找,按某种格式tokenize字符串,或者是基于某种规则修改字符串。由于C++没有提供正则表达式支持,使得有些用户被迫转向其它支持正则表达式的语言,如Perl, awk, 和 sed。Regex提供了高效和强大的正则表达式支持,基于与STL同样的前提而设计,这使得它很容易使用。Regex已被即将发布的Library Technical Report接受。
Regex库如何改进你的程序?
- 为C++带来了对正则表达式的支持
- 改进有效输入的健壮性
在文本处理中常常会用到正则表达式。例如,有很多验证有效性的工作适合使用正则表达式。考虑一个应用程序,它要求输入只由数字组成。而另一个程序可能要求一种特殊的格式,如三个数字,后跟一个字母,再后跟两个数字。你可能要验证邮政编码、信用卡号码、社会保险号码,或者其它东西;使用正则表达式来做这些验证是很简单的。另外一个可以使用正则表达式的地方是文本替换,即用某些文本替换掉另一些文本。假如你需要在很多文档中将单词colour 转换为 color。正则表达式提供了最好的方法来做这个工作,包括同时记住替换 Colour 和 COLOUR, 以及复数形式的 colours, 动词 colourize, 等等。还有一个可以使用正则表达式的地方就是,格式化文本。
许多流行的编程语言,Perl是其中一例,都内建了对正则表达式的支持,但在C++里没有。C++标准在提到正则表达式时也保持了沉默。Boost.Regex是一个非常完善并有效的库,它将正则表达式并入了C++程序,并且它包含了Perl, grep和Emacs等常见工具所使用的几种不同语法。它是最著名的C++正则表达式库之一,既容易使用又异常强大。
Regex 如何适用于标准库?
目前的C++标准库是不支持正则表达式的。这是令人遗憾的,有那么多对正则表达式的需要,有时用户为了编写需要支持正则表达式的程序而不得不放弃使用C++。Boost.Regex填补了标准在这方面的空白,并且它已经被提议加入到下一个版本的C++标准中。Boost.Regex已经被即将发布的Library Technical Report所接受。
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;
- unsigned mark_count() const;
- flag_type flags() const;
- typedef basic_regex<char> regex;
- typedef basic_regex<wchar_t> wregex;
普通函数
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_match(
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>&, 还有一个重载接受两个双向迭代器作为输入参数。
Boost.Regex 用法
要使用Bo