b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Boost学习指南之:正则表达式(3)

电脑杂谈  发布时间:2019-05-14 14:20:03  来源:网络整理

因此,第一个子表达式会匹配 "Note that I'm" 而第二个匹配 "31".看一下 regex_iterator我们已经看过如何用几次 regex_search 调用来处理所有输入,但另一方面,更为优雅的方法是使用 regex_iterator. 这个迭代器类型用一个序列来列举正则表达式的所有匹配。解引用一个 regex_iterator 会产生对一个 match_results 实例的引用。boost 中文正则支持构造一个 regex_iterator 时,你要把指示输入序列的迭代器传给它,并提供相应的正则表达式。我们来看一个例子,输入数据是一组由逗号分隔的整数。相应的正则表达式很简单。boost::regex reg("(\\d+),?");复制代码在正则表达式的最后加一个 ? (匹配零次或一次) 确保最后一个数字可以被成功分析,即使输入序列不是以逗号结束。另外,我们还使用了另一个重复符 +. 这个重复符表示匹配一次或多次。现在,不需要多次调用 regex_search, 我们创建一个 regex_iterator, 并调用算法 for_each, 传给它一个函数对象,该函数对象以迭代器的解引用进行调用。

下面是一个接受任意形式的match_results的函数对象,它有一个泛型的调用操作符。它所执行的就是把当前匹配的值加到一个总和中(在我们的正则表达式中,第一个子表达式是我们要用的)。class regex_callback {int sum_;public:regex_callback() : sum_(0) {}template <typename T> void operator()(const T& what) {sum_+=atoi(what[1].str().c_str());}int sum() const {return sum_;}};复制代码现在把这个函数对象的一个实例传递给 std::for_each, 结果是对每一个迭代器it的解引用调用该函数对象,即对每一次匹配的子表达式进行调用。int main() {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 一个缺省构造实例。

boost 正则_正则表达式 中文匹配_boost 中文正则支持

it 和 end 的类型均为 boost::sregex_iterator, 即为 regex_iterator<std::string::const_iterator>的typedef. 这种使用 regex_iterator 的方法要比我们前面试过的多次匹配的方法更清晰,在多次匹配的方法中我们不得不在一个循环中让起始迭代器不断地前进并调用 regex_search 。用 regex_token_iterator 分割字符串另一个迭代器类型,或者说得更准确些,迭代器适配器,就是 boost::regex_token_iterator. 它与 regex_iterator 很类似,但却是用于列举不匹配某个正则表达式的每一个字符序列,这对于分割字符串很有用。它也可以用于选择对哪一个子表达式感兴趣,当解引用 regex_token_iterator时,只有预订的那个子表达式被返回。考虑这样一个应用程序,它接受一些用斜线号分隔的数据项作为输入。两个斜线号之间的数据组成应用程序要处理的项。使用 regex_token_iterator来分割这个字符串很容易。该正则表达式很简单。boost::regex reg("/");复制代码这个 regex 匹配各项间的分割符。

要用它来分割输入,只需简单地把指定的索引 1 传递给 regex_token_iterator 的构造函数。以下是完整的程序:int main() {boost::regex reg("/");std::string s="Split/Values/Separated/By/Slashes,";std::vector<std::string> vec;boost::sregex_token_iterator it(s.begin(),s.end(),reg,-1);boost::sregex_token_iterator end;while (it!=end)vec.push_back(*it++);assert(vec.size()==std::count(s.begin(),s.end(),'/')+1);assert(vec[0]=="Split");}复制代码就象 regex_iterator 一样,regex_token_iterator 是一个模板类,它使用所包装的序列的迭代器类型来进行特化。这里,我们用的是 sregex_token_iterator, 它是 regex_token_iterator<std::string::const_iterator> 的 typedef 。

文本格式约定:术语元字符/语法格式正则表达式正则表达式中的一部分(用于分析)对其进行匹配的源字符串对正则表达式或其中一部分的说明。有关正则表达式的语法还有最后一个元素,那就是正则表达式的属性,它说明的是高级模式匹配的规则.和其它正则表达式语法不同,属性是在 / 符号之外说明的.即它。正则表达式语法完全解析这个是我以前学正则表达式最怕的部分,搞的似懂非懂,现在又一次学到这了1、[a-z]at任何包含在方括号中的内容都是一个字符类--一个被匹配字符所属的字符集合。

另一种重要的正则表达式特性是使用元字符 ^ 表示非字符类别。用它来表示一个匹配任意不在给定字符类别中的字符;即你所列字符类别的补集。例如,看如下正则表达式。boost::regex reg("[^13579]");复制代码它包含一个非字符类别,匹配任意不是奇数数字的字符。看一下以下这个小程序,试着给出程序的输出。int main() {boost::regex reg4("[^13579]");std::string s="0123456789";boost::sregex_iterator it(s.begin(),s.end(),reg4);boost::sregex_iterator end;while (it!=end)std::cout << *it++;}复制代码你给出答案了吗?输出是 "02468",即所有偶数数字。注意,这个字符类别不仅匹配偶数数字,如果输入字符串是 "AlfaBetaGamma",那么也会全部匹配。我们看到的这个元字符, ^, 还有另一个意思。它可以用来表示一行的开始。而元字符 $ 则表示一行的结束。错的正则表达式一个错的正则表达式就是一个不遵守规则的正则表达式。

例如,你可能忘了一个右括号,这样正则表达式引擎将无法成功编译这个正则表达式。这时,将抛出一个 bad_expression 类型的异常。正如我前面提到的,这个异常的名字将会在下一版本的Boost.Regex中被修改,还有在即将加入Library Technical Report的版本中也是。异常类型 bad_expression 将被更名为 regex_error.如果你的应用程序中的正则表达式全都是硬编码的,你可能不用处理错误表达式,但如果你是接受了用户的输入来作为正则表达式,你就必须准备进行错误处理。这里有一个程序,提示用户输入一个正则表达式,接着输入一个用来对正则表达式进行匹配的字符串。由用户进行输入时,总是有可能会导致无效的输入。int main() {std::cout << "Enter a regular expression:\n";std::string s;std::getline(std::cin, s);try {boost::regex reg(s);std::cout << "Enter a string to be matched:\n";std::getline(std::cin,s);if (boost::regex_match(s,reg))std::cout << "That's right!\n";elsestd::cout << "No, sorry, that doesn't match.\n";}catch(const boost::bad_expression& e) {std::cout <<"That's not a valid regular expression! (Error: " <<e.what() << ") Exiting...\n";}}复制代码为了保护应用程序和用户,一个 try/catch 块用于处理构造时抛出 boost::regex 的情形,这时会打印一个提示信息,而程序会温和地退出。

用这个程序来测试,我们开始时输入一些合理的数据。Enter a regular expression:\d{5}Enter a string to be matched:12345That's right!现在,给一些错误的数据,试着输入一个错误的正则表达式。Enter a regular expression:(\w*))That's not a valid regular expression! (Error: Unmatched ( or \() Exiting...在regex reg构造时,就会抛出一个异常,因为这个正则表达式不能被编译。因此,进入到 catch 的处理例程中,程序将打印一个错误信息并退出。你只需知道有三个可能会发生异常的地方。一个是在构造一个正则表达式时,就象你刚刚看到的那样;另一个是使用成员函数 assign 把正则表达式赋给一个 regex 时。最后一个是,regex迭代器和算法也可能抛出异常,如果内存不够或者匹配的复杂度过快增长的话。Regex 总结无可争议,正则表达式是非常有用和重要的,而本库给C++带来了强大的正则表达式功能。传统上,用户除了使用POSIX C API来实现正则表达式功能以外,别无选择。

13. 正则表达式支持库内修复了"正则表达式.替换"、"正则表达式.替换w"两个命令中"用作替换的文本"为空时替换失败的bug.。正则替换:根据正则表达式匹配内容并替换。正则表达式语法(perl正则表达式语法)的讲解,boost.regex库的使用。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-98601-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...