
replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。 可以理解为搜索字符向量中匹配参数pattern的模型,fixed的逻辑值决定将pattern视为正则表达式或一个文本字符串,若fixed=ture,则视pattern为文本字符串(精确匹配)。replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换。
php中对于正则处理文本提供了两种方式,一种是pcre方式(pcre库是一个实现了与perl 5在语法和语义上略有差异(详见下文)的正则表达式模式匹配功能的函数集. 当前的实现对应于perl 5.005.)。脚本语言往往把一些系统工具性质的东西(比如正则表达式,web 概念)加入到语法里面,导致初学者为它们浪费太多时间,却没有理解编程最关键的概念:变量,函数,递归,类型……。regex:强大而易用的正则表达式库,支持perl、sed、awk等正则表达式语法。
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 的异常。
包含正则表达式模式或可用标志的正则表达式对象。包含正则表达式模式和可用标志的正则表达式对象。为包含正则表达式模式和可用标志的正则表达式对象。
这两个类型,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>&, 还有一个重载接受两个双向迭代器作为输入参数。
![]()
Boost.Regex 用法要使用Boost.Regex, 你需要包含头文件"boost/regex.hpp". Regex是本书中两个需要独立编译的库之一(另一个是Boost.Signals)。你会很高兴获知如果你已经构建了Boost— —那只需在命令提示符下打一行命令——就可以自动链接了(对于Windows下的编译器),所以你不需要为指出那些库文件要用而费心。你要做的第一件事就是声明一个类型 basic_regex 的变量。这是该库的核心类之一,也是存放正则表达式的地方。创建这样一个变量很简单;只要将一个含有你要用的正则表达式的字符串传递给构造函数就行了。boost 中文正则支持boost::regex reg("(A.*)");复制代码这个正则表达式具有三个有趣的特性。第一个是,用圆括号把一个子表达式括起来,这样可以稍后在同一个正则表达式中引用它,或者取出匹配它的文本。我们稍后会详细讨论它,所以如果你还不知道它有什么用也不必担心。第二个是,通配符(wildcard)字符,点。这个通配符在正则表达式中有非常特殊的意义;这可以匹配任意字符。最后一个是,这个表达式用到了一个重复符,*, 称为Kleene star, 表示它前面的表达式可以被匹配零次或多次。
这个正则表达式已可以用于某个算法了,如下:bool b=boost::regex_match("This expression could match from A and beyond.",reg);复制代码如你所见,你把正则表达式和要分析的字符串传递给算法 regex_match. 如果的确存在与正则表达式的匹配,则该函数调用返回结果 true ;否则,返回 false. 在这个例子中,结果是 false, 因为 regex_match 仅当整个输入数据被正则表达式成功匹配时才返回 true 。你知道为什么是这样吗?再看一下那个正则表达式。第一个字符是大写的 A, 很明显能够匹配这个表达式的第一个字符在哪。所以,输入的一部分"A and beyond."可以匹配这个表达式,但这不是整个输入。让我们试一下另一个输入字符串。bool b=boost::regex_match("As this string starts with A, does it match? ",reg);复制代码这一次,regex_match 返回 true. 当正则表达式引擎匹配了 A, 它接着看后续有什么。
在我们的regex变量中,A 后跟一个通配符和一个Kleene star, 这意味着任意字符可以被匹配任意次。因而,分析过程开始扔掉输入字符串的剩余部分,即匹配了输入的所有部分。接下来,我们看看如何使用regexes 和 regex_match 来进行数据验证。验证输入正则表达式常用于对输入数据的格式进行验证。应用软件通常要求输入符合某种结构。考虑一个应用软件,它要求输入一定要符合如下格式,"3个数字, 一个单词, 任意字符, 2个数字或字符串"N/A," 一个空格, 然后重复第一个单词." 手工编写代码来验证这个输入既沉闷又容易出错,而且这些格式还很可能会改变;在你弄明白之前,可能就需要支持其它的格式,你精心编写的分析器可能就需要修改并重新调试。让我们写出一个可以验证这个输入的正则表达式。首先,我们需要一个匹配3个数字的表达式。对于数字,我们应该使用一个特别的缩写,\d。要表示它被重复3次,需要一个称为bounds operator的特定重复,它用花括号括起来。把这两个合起来,就是我们的正则表达式的开始部分了。boost::regex reg("\\d{3}");复制代码注意,我们需要在转义字符(\)之前加一个转义字符,即在我们的字符串中,缩写 \d 变成了 \\d 。
这是因为编译器会把第一个\当成转义字符扔掉;我们需要对\进行转义,这样\才可以出现在我们的正则表达式中。接下来,我们需要定义一个单词的方法,即定义一个字符序列,该序列结束于一个非字母字符。有不只一种方法可以实现它,我们将使用字符类别(也称为字符集)和范围这两个正则表达式的特性来做。字符类别即一个用方括号括起来的表达式。例如,一个匹配字符a, b, 和 c中任一个的字符类别表示为:[abc]. 如果用范围来表示同样的东西,我们要写:[a-c]. 要写一个包含所有字母的字符类型,我们可能会有点发疯,如果要把它写成: [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ], 但不用这样;我们可以用范围来表示:[a-zA-Z]. 要注意的是,象这样使用范围要依赖于当前所用的locale,如果正则表达式的 basic_regex::collate 标志被打开。使用以上工具以及重复符 +, 它表示前面的表达式可以重复,但至少重复一次,我们现在可以表示一个单词了。boost::regex reg("[a-zA-Z]+");复制代码以上正则表达式可以工作,但由于经常要表示一个单词,所以有一个更简单的方法:\w. 这个符号匹配所有单词,不仅是ASCII的单词,因此它不仅更短,而且也更适用于国际化的环境。
正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。这些字符都是在正则表达式中被“征用”了,称之为特殊字符,引用的时候,必须前面加 "\" 进行区分,比如你要用到 "$" 字符的时候,必须使用 "\$",这样程序才不会以为你是在匹配行尾。,好麻烦,正则表达式还提供了范围类,我们可以使用 x-y来连接两个字符表示从x到y的任意字符,这是个闭区间,也就是说包含x和ybenshen,这样匹配小写字母就很简单了。
这样,我们就得到了整个正则表达式,用于表示"3个数字, 一个单词, 任意字符, 2个数字或字符串"N/A," 一个空格, 然后重复第一个单词.":boost::regex reg("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1");复制代码干的好!下面是一个简单的程序,把这个表达式用于算法 regex_match, 验证两个输入字符串。#include <iostream>#include <cassert>#include <string>#include "boost/regex.hpp"int main() {// 3 digits, a word, any character, 2 digits or "N/A",// a space, then the first word againboost::regex reg("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1");std::string correct="123Hello N/A Hello";std::string incorrect="123Hello 12 hello";assert(boost::regex_match(correct,reg)==true);assert(boost::regex_match(incorrect,reg)==false);}复制代码第一个字符串,123Hello N/A Hello, 是正确的;123 是3个数字,Hello 是一个后跟任意字符(一个空格)的单词, 然后是N/A和另一个空格,最后重复单词Hello 。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-98601-1.html
上台后坚持独立外交
麦地路
上面七只