您的当前位置:首页C++正则表达式编程

C++正则表达式编程

2024-01-13 来源:乌哈旅游
Boost 正则表达式编程

定义变量:typedef basic_regex regex;

typedef basic_regex wregex;

1. 匹配检测函数:template

bool regex_match(

const charT* str, //待匹配字符串

match_results& m,//返回匹配结果 const basic_regex& e,//正则表达式串

match_flag_type flags = match_default);//匹配标志,否则采用默

认匹配标志

注明:只有当字符串完全匹配才返回true

2. 字符串搜索函数:查找子序列,该子序列匹配正则表达式e。 template bool regex_search( const charT* str,

match_results& m, const basic_regex& e, match_flag_type flags = match_default);

3. 字符串替换函数:在整个字符序列中查找正则表达式e的所有匹配,每次匹配成功后,就根据参数fmt对字符串进行格式化。没有匹配则不会修改字符串。

template basic_string regex_replace( const basic_string& s, const basic_regex& e, const basic_string& fmt, match_flag_type flags = match_default); 这三个算法有三种不同的重载形式(参数的不同):

1. const charT*(charT为字符类型):指针 2. const basic_string&:引用 3. bidirectional_iterator bit:双向迭代器

Boost.Regex的用法:

1.包含头文件:#include

2. 声明一个类型为basic_regex的变量,只要将一个含有要用的正则表达式的字符串传递给构造函数,eg:boost::regex reg(“(A.*)”) 。 boost::regex reg(\"\\\\d{3}[a-zA-Z]+.(\\\\d{2}|N/A)\\\\s\");

为了可以引用表达式 [a-zA-Z]+, 我们必须先把它用圆括号括起来。这使得表达式([a-zA-Z]+)成为我们的正则表达式中的第一个子表达式,为了在字符串后面再次匹配第一个字表达式,可以用\\1来建立反向引用。

3.在boost::regex中使用正则表达式时,如\\d表示匹配数字,但是需要加双”\\\\”即为:\\\\d等于测试其中\\d

4. 表达式 $N表示匹配的子表达式, N 为子表达式索引。因此我们的

格式化串应该是 \"$1$3\", 表示替换文本为第一个和第三个子表达式. 5. 你可以用一些特定的缓冲操作符来让 regex_search 象 regex_match 那样运行。\\A 匹配缓冲的起始点,而 \\Z 匹配缓冲的结束点, 把 \\A 放在正则表达式的开始,把 \\Z 放在最后,你就可以让 regex_search 象 regex_match 那样使用,即必须匹配所有输入。 6.关于重复和贪婪

特殊含义符:+、*是贪婪的,会消耗尽可能多的输入。

eg:boost::regex reg(\"(.*)(\\\\d{2})\");会导致你的输入无法完成匹配,因为.*已经将 所有输入完全消耗。在.*后面加?就能转化为非贪婪模式。

7.根据所用的字符串类型决定匹配结果的变量类型

template > class match_results;

typedef match_results cmatch;//字符序列常量

typedef match_results wcmatch;//宽字符序列常量

typedef match_results smatch;//string常迭代器。

typedef match_results wsmatch;//宽string常迭代器。

8. regex_iterator:本迭代器类型用一个序列来列举正则表达式的所有匹配。

eg:boost::regex reg(\"(\\\\d+),?\"); std::string s=\"1,1,2,3,5,8,13,21\";

boost::sregex_iterator it(s.begin(),s.end(),reg); boost::sregex_iterator end; regex_callback c;

int sum=for_each(it,end,c).sum();

注:传递给for_each的end迭代器是 regex_iterator 一个缺省构造实例。it 和 end 的类型均为 boost::sregex_iterator, 即为 regex_iterator的typedef. 这种使用 regex_iterator 的方法要比我们前面试过的多次匹配的方法更清晰,在多次匹配的方法中我们不得不在一个循环中让起始迭代器不断地前进并调用 regex_search 。 9.正则表达式异常处理 try {

boost::regex reg(s); }

catch(const boost::bad_expression& e) { }

三个可能会发生异常的地方:

1.是在构造一个正则表达式时,正则表达式不能被编译通过; 2.是使用成员函数 assign 把正则表达式赋给一个 regex 时; 3.是regex迭代器和算法也可能抛出异常,如果内存不够或者匹配的复杂度过快增长的话。 正则表达式小知识点:

1. 用中括号 [^] 包含多个字符,构成否定格式,可以匹配所包含的字符之外的任意一个字符。

因篇幅问题不能全部显示,请点此查看更多更全内容