CAtlRegExp Class

 

CAtlRegExp 类用于表示并处理正则表达式。模板类,定义如下:

 
 
template <
class CharTraits = CAtlRECharTraits
>
class CAtlRegExp

参数

CharTraits

字符特征对象.例如, 默认的 CAtlRECharTraitsA.

调用 Parse 方法设置正则表达式

 
CAtlRegExp<> re;
re.Parse( "{[0-9]?[0-9]}:{[0-9][0-9]}" ); // Time in h:mm or hh:mm format

Parse 将正则表达式转换为 CAtlRegExp 内部的模式匹配自动机.

调用 Match 方法实现对字符串的匹配

 
 
re.Match( "1:57", &mc );  // Returns TRUE: successful match
re.Match( "01/03", &mc ); // Returns FALSE: no match

Match 方法的参数是需要匹配的字符串以及一个 CAtlREMatchContext 对象。如上所述的正则表达式,有两组对比通过大括号分隔,如果正则表达式和输入字符串匹配,CAtlREMatchContext 对象可以用来从输入字符串中提取实际匹配组的字符串(在该例中,是小时和分钟)。详细信息可参考 CAtlReMatchContext.

Match 方法有第三个可选的参数。如果使用第三个可选的参数, Match 会设置其指向字符串中匹配的最后一个字符的下一个位置。这使得你可以继续比对剩余的字符串。

正则表达式语法:

CAtlRegExp 下使用的正则表达式语法

 
元字符 含义

.

匹配任意的单个字符.

[ ]

表示一个字符类.匹配方括号下的任意一个字符。 (例如, [abc] 匹配 "a", "b", 和 "c").

^

如果该元字符在一个字符类的开始处使用,它表示对字符类取反。一个取反的字符类匹配除该字符类里的任意字符。 (例如, [^abc] 匹配除了 "a", "b", 和 "c"以外的字符).

如果 ^ 处在正则表达式的开始处, 它将匹配输入的开始字符串部分。(例如, ^[abc] 只匹配以"a", "b", 或 "c"开始的字符串).

-

在字符类内部,表示字符的方位。 (例如, [0-9] 匹配从"0" 到 "9"的任意数字).

?

表示在前面的表达式是可选的: 它将匹配1次或0次 (例如, [0-9][0-9]? 匹配"2" 和 "12").

+

表示前面的表达式匹配一到多次。 (例如, [0-9]+   匹配 "1", "13", "456",等).

*

表示前面的表达式匹配0 到 多次.

??, +?, *?

? , + 和 * 的非穷尽(Non-greedy)版。和? , + , *  不同,非穷尽版进行尽可能少的匹配。

(例如, 假设有输入  "<abc><def>",   <.*?>    匹配 "<abc>"      但是  <.*>   匹配 "<abc><def>").

( )

组操作. 例如: (\d+,)*\d+  匹配一组被逗号分隔的数字(例如, "1" or "1,23,456").

{ }

表示一个匹配组. 对于输入字符串,匹配大括号里的正则表达式的实际文本可以通过 CAtlREMatchContext 对象检索.

\

转义字符: 对下一个字符进行字面翻译。(例如, [0-9]+ 匹配一个活多个数字,  但是[0-9]\+匹配一个数字后加一个"+"字符).

也可用于缩写(例如 \a 表示任意字母数字; 参见下表).

如果 \ 后面紧跟一个数字 n,它将匹配第n个匹配组(从0开始). 例如: <{.*?}>.*?</\0>   匹配 "<head>Contents</head>".

注意, 在C++的字符串中, 必须使用双斜杠: "\\+""\\a""<{.*?}>.*?</\\0>".

$

在正则表达式的尾部,该字符匹配输入字符串的尾部。 (例如,[0-9]$ 匹配以数字结尾的输入).

|

交替操作符: 分隔两个表达式, 表示两个匹配其中一个 (例如, T|the 匹配 "The" or "the").

!

取反操作符: the expression following ! does not match the input(for example, a!b matches "a" not followed by "b").

缩写词

CAtlRegExp 可以处理缩写词, 例如使用 \d 替换[0-9]. 缩写词由传递给CharTraits 的参数提供. 预定义的字符特性提供如下所示的缩写。

 
Abbreviation Matches

\a

任意字母数字: ([a-zA-Z0-9])

\b

空格 (空): ([ \\t])

\c

任意字母: ([a-zA-Z])

\d

任意十进制数字: ([0-9])

\h

任意十六进制数字: ([0-9a-fA-F])

\n

换行: (\r|(\r?\n))

\q

带引号的字符串: (\"[^\"]*\")|(\'[^\']*\')

\w

一个简单的单词: ([a-zA-Z]+)

\z

一个整数: ([0-9]+)

Example


 
下述例子使用正则表达式提取URL部分
 
 
// catlregexp_class.cpp
#include <afx.h>
#include <atlrx.h> int main(int argc, char* argv[])
{
CAtlRegExp<> reUrl;
// Five match groups: scheme, authority, path, query, fragment
REParseError status = reUrl.Parse(
"({[^:/?#]+}:)?(//{[^/?#]*})?{[^?#]*}(?{[^#]*})?(#{.*})?" ); if (REPARSE_ERROR_OK != status)
{
// Unexpected error.
return 0;
} CAtlREMatchContext<> mcUrl;
if (!reUrl.Match(
"http://search.microsoft.com/us/Search.asp?qu=atl&boolean=ALL#results",
&mcUrl))
{
// Unexpected error.
return 0;
} for (UINT nGroupIndex = 0; nGroupIndex < mcUrl.m_uNumGroups;
++nGroupIndex)
{
const CAtlREMatchContext<>::RECHAR* szStart = 0;
const CAtlREMatchContext<>::RECHAR* szEnd = 0;
mcUrl.GetMatch(nGroupIndex, &szStart, &szEnd); ptrdiff_t nLength = szEnd - szStart;
printf_s("%d: \"%.*s\"\n", nGroupIndex, nLength, szStart);
} return 0;
}

Output

0: "http"
1: "search.microsoft.com"
2: "/us/Search.asp"
3: "qu=atl&boolean=ALL"
4: "results"
 
需要头文件 兼容性

CAtlRegExp

<atlrx.h>

Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003, Windows Server 2003

 
 
参考:
 
注: 英文很烂,翻译不好,如有错误,欢迎提醒!

【转】CAtlRegExp class .的更多相关文章

  1. 使用CAtlRegExp类进行密码校验

    前言 最近做了一个小需求,新建用户时输入的密码必须包含数字.小写字母.大写字符以及特殊字符,目的是为了增强密码的强度,如果没有其中一项,就需要弹出窗口进行提示. 正则表达式          对于此类 ...

  2. VC中使用ATL库实现正则表达式匹配(ADODB::Error)

    1. 确保项目属性中ATL使用处于打开状态. 如VS中项目属性常规—ATL使用—静态链接到ATL 2. 在使用时加上头文件 #include "atlrx.h" 3. 使用示例代码 ...

  3. 基于公网smtp协议实现邮件服务器

    刚开始做邮件服务器开发,一切都是茫然的.在书上网上都很难找到一套完整的邮件服务器开发教程.在个人的摸索中碰到了很多蛋疼得问题.现终于完成了,将我的开发经验分享给大家. 开发环境:vs2012 mfc ...

随机推荐

  1. MySql翻页查询

    分页查询在网页中随处可见,那原理是什么呢?下面简单介绍一下基于MySql数据库的limit实现方法. 首先明确为什么要使用分页查询,因为数据庞大,查询不可能全部显示在页面上,如果全部显示在页面上,也会 ...

  2. 最简单的理解 建立TCP连接 三次握手协议

     最简单的理解一:建立TCP连接:三次握手协议    客户端:我要对你讲话,你能听到吗:服务端:我能听到:而且我也要对你讲话,你能听到吗:客户端:我也能听到.…….互相开始通话…….. 二:关闭TCP ...

  3. springboot启动流程(九)ioc依赖注入

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 在前面的几篇文章中,我们多次提到这么一个转化过程: Bean配置 --> Bean ...

  4. 现有项目springmvc 小结

    1. 接口接收json数据 @RequestBody JSONObject param 2.返回json数据封装 DataPacket.jsonResult

  5. Ubuntu的apt-get代理设置

    三种方法 -o选项 # sudo apt-get -o Acquire::http::proxy="http://127.0.0.1:8080/" update 配置文件 # vi ...

  6. Django drf:认证及组件、token、局部钩子源码分析

    一.drf认证功能 二.token讲解 三.局部钩子源码分析 一.drf认证功能 1.认证简介: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录则不能查 ...

  7. 机器学习 三剑客 之 pandas + numpy

    机器学习 什么是机器学习? 机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测 机器学习存在的目的和价值领域? 领域: 医疗.航空.教育.物流.电商 等... 目的: 让机器学习 ...

  8. curl、fopen和file_get_contents区别

    curl多用于互联网网页之间的抓取,fopen多用于读取文件,而file_get_contents多用于获取静态页面的内容. 1. fopen /file_get_contents 每次请求都会重新做 ...

  9. 《流畅的Python》Data Structures--第7章 colsure and decorator

    Function Decorators and Closures 装饰器是用于增强函数的行为,理解它,就必须先理解闭包. Python3引入关键字nonlocal,如果要理解闭包,就必须了解它的所有方 ...

  10. 如何python循环中删除字典元素

    //下面这行就是在循环中遍历删除字典元素的方法! for i in list(dictheme2.keys()): if dictheme2[i]<self.countFortheme: dic ...