【转】CAtlRegExp class .
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]+) |
// 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 .的更多相关文章
- 使用CAtlRegExp类进行密码校验
前言 最近做了一个小需求,新建用户时输入的密码必须包含数字.小写字母.大写字符以及特殊字符,目的是为了增强密码的强度,如果没有其中一项,就需要弹出窗口进行提示. 正则表达式 对于此类 ...
- VC中使用ATL库实现正则表达式匹配(ADODB::Error)
1. 确保项目属性中ATL使用处于打开状态. 如VS中项目属性常规—ATL使用—静态链接到ATL 2. 在使用时加上头文件 #include "atlrx.h" 3. 使用示例代码 ...
- 基于公网smtp协议实现邮件服务器
刚开始做邮件服务器开发,一切都是茫然的.在书上网上都很难找到一套完整的邮件服务器开发教程.在个人的摸索中碰到了很多蛋疼得问题.现终于完成了,将我的开发经验分享给大家. 开发环境:vs2012 mfc ...
随机推荐
- Asp.Net Core 轻松学系列-1阅读指引目录
https://www.cnblogs.com/viter/p/10474091.html 目录 前言 1. 从安装到配置 2. 业务实现 3. 日志 4. 测试 5. 缓存使用 6.网络和通讯 7. ...
- 基于vue的购物车清单
<!doctype html> <html> <head> <meta charset="utf-8"> <link rel= ...
- innodb是如何巧妙实现事务隔离级别-转载
原文地址:innodb是如何巧妙实现事务隔离级别 之前的文章mysql锁机制详解中我们详细讲解了innodb的锁机制,锁机制是用来保证在并发情况下数据的准确性,而要保证数据准确通常需要事务的支持,而m ...
- 为什么JAVA线程中没有Running状态?
面试官问:为什么 Java 线程没有 Running 状态?我懵了 —— 转 芋道源码 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如 ...
- nmap中文帮助文档
简介: Nmap(“ Network Mapper ”)是用于网络探索和安全审核的开源工具.它设计用于快速扫描大型网络,尽管它可以在单个主机上正常运行.Nmap以新颖的方式使用原始IP数据包来确定网络 ...
- 【2017-09-04】JavaWeb内置对象
Jsp页面中引入别的页面 include命令 <%@ include file="要引入的页面路径"%> 页面中的form表单提交方式: post: 提交内容不可见, ...
- Linux学习笔记(十一)shell基础:管道符、通配符和其他特殊符号
一.多命令顺序执行 && || 相当于其他高级语言中的 ? : 二.管道符 [命令1] | [命令2] 命令1的正确输出作为命令2的操作对象 分屏显示结果 netstat -an 命令 ...
- .net 后台给html控件赋值
接上篇,上篇中每个专业的名称是写死的,如何动态获取数据库中的值,同时对其他代码产生最小影响呢? 前台代码 <div " id="div1" runat=" ...
- Java并发包--ThreadPoolExecutor
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509941.html ThreadPoolExecutor简介 ThreadPoolExecutor是线 ...
- pycharm分辨率&清晰度
三个月前换了新电脑,安装pycharm.又换了新的大屏幕. pycharm界面拖到大屏上时,字大小和字体都没有变化,清晰度低了很多,就像打了一层薄薄的马赛克一样.拖回到原本的屏幕又清晰了. 一直以为是 ...