C++正则表达式

来源:互联网 发布:c语言高级实例解析 编辑:程序博客网 时间:2024/04/29 16:25

C++里面使用正则表达式一般有三种:C regex,C++regex, boostregex , pcre

Cregex 的速度是最快的

C++regex 速度一般

boostregex 速度最慢,但是用起来最方便

特殊需求表达式

1Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

2域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

 3 InternetURL:[a-zA-z]+://[^\s]*^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

 4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

 5 电话号码("XXX-XXXXXXX""XXXX-XXXXXXXX""XXX-XXXXXXX""XXX-XXXXXXXX""XXXXXXX""XXXXXXXX)^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

 6 国内电话号码(0511-4405222021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

 7 身份证号(15位、18位数字):^\d{15}|\d{18}$

 8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

 9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

10密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$

11强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 

12日期格式:^\d{4}-\d{1,2}-\d{1,2}

13一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$

14一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

15钱的输入格式:

16    1.有四种钱的表示形式我们可以接受:"10000.00""10,000.00", 和没有 "分""10000""10,000"^[1-9][0-9]*$

17    2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$

18    3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$

19    4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$

20    5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是"10""10.2" 是通过的:^[0-9]+(.[0-9]{2})?$

21    6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$

22    7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

23    8.1到3个数字,后面跟着任意个逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

25xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

26中文字符的正则表达式:[\u4e00-\u9fa5]

27双字节字符:[^\x00-\xff]   (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
28空白行的正则表达式:\n\s*\r   (可以用来删除空白行)

29HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />   (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
30 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$)   (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

31腾讯QQ号:[1-9][0-9]{4,}   (腾讯QQ号从10000开始)

32中国邮政编码:[1-9]\d{5}(?!\d)   (中国邮政编码为6位数字)

33IP地址:\d+\.\d+\.\d+\.\d+   (提取IP地址时有用)
34IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

来源:http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html

正则表达式语法

元素

元素可以是下列项之一:

一般字符,可匹配目标序列中的相同字符。

通配符“.”,可匹配目标序列中除换行符外的任何字符。

“[expr]”形式的括号表达式,可匹配目标序列中已包含在表达式“expr”定义集内的字符或排序规则元素;或者采用“[^expr]”形式,可匹配目标序列中未包含在表达式“expr”定义集内的字符或排序规则元素。

表达式“expr“可以包含下列项的任意组合:

单个字符。将该字符添加到“expr”定义的集合。

“ch1-ch2”形式的字符值域。将闭值域[ch1,ch2] 所表示的字符添加到expr定义的集合。

“[:name:]”形式的字符类。 将命名类中的字符添加到expr定义的集合。

“[=elt=]”形式的等价类。 将等效于elt的排序规则元素添加到expr定义的集合。

“[.elt.]”形式的排序规则符号。将排序规则元素elt添加到expr定义的集合。

定位点。 定位点“^”可匹配目标序列的开头;定位点“$”可匹配目标序列的末尾。

“( 子表达式 )”形式的捕获组,或者采用BRE和grep中的“\( 子表达式 \)”形式,可匹配目标序列中与分隔符之间的模式相符的字符序列。

“\k”形式的标识转义,可匹配目标序列中的字符k。

示例:

“a”可匹配目标序列“a”,但不匹配目标序列“B”、“b”或“c”。

“.”可匹配所有目标序列“a”、“B”、“b”和“c”。

“[b-z]”可匹配目标序列“b”和“c”,但不匹配目标序列“a”或“B”。

“[:lower:]”可匹配目标序列“a”、“b”和“c”,但不匹配目标序列“B”。

“(a)”可匹配目标序列“a”并将捕获组 1 与子序列“a”相关联,但不匹配目标序列“B”、“b”或“c”。

在ECMAScript、BRE和grep中,元素也可以是“\dd”形式的向后引用,其中,dd表示一个十进制值,此值可匹配目标序列中的某一字符序列,而该序列与第 N 个捕获组所匹配的字符序列相同。例如,“(a)\1”可匹配目标序列“aa”,因为第一个(而且是唯一一个)捕获组可匹配初始序列“a”,然后 \1 可匹配最终序列“a”。

在ECMAScript中,元素可以是下列项之一:

“(?: 子表达式 )”形式的非捕获组。 可匹配目标序列中与分隔符之间的模式相符的字符序列。

“\f”、“\n”、“\r”、“\t”或“\v”形式的有限文件格式转义。 它们分别匹配目标序列中的换页符、换行符、回车符、水平制表符和垂直制表符。

“(?= 子表达式 )”形式的肯定断言。 可匹配目标序列中与分隔符之间的模式相符的字符序列,但不会更改目标序列中的匹配位置。

“(?! 子表达式 )”形式的 否定断言。 可匹配目标序列中与分隔符之间的模式不符的任意字符序列,并不会更改目标序列中的匹配位置。

“\xhh”形式的十六进制转义序列。 可匹配目标序列中由两个十六进制数字hh表示的字符。

“\uhhhh”形式的 unicode 转义序列。 可匹配目标序列中由四个十六进制数字hhhh表示的字符。

“\ck”形式的控件转义序列。 可匹配由字符k命名的控制字符。

“\b”形式的字边界断言。 当在目标序列中的当前位置紧跟在字边界之后时,此断言即匹配。

“\B”形式的负字边界断言。 当在目标序列中的当前位置并非紧跟在字边界之后时,此断言即匹配。

“\d”、“\D”、“\s”、“\S”、“\w”、“\W”形式的 dsw 字符转义。 为字符类提供一个短名称。

示例:

“(?:a)”可匹配目标序列“a”,但“(?:a)\1”无效,因为不存在捕获组1。

“(?=a)a”可匹配目标序列“a”。 肯定断言可匹配目标序列中的初始序列“a”,并且正则表达式中最后的“a”可匹配目标序列中的初始序列“a”。

“(?!a)a”不匹配目标序列“a”。

“a\b.”可匹配目标序列“a~”,但不匹配目标序列“ab”。

“a\B.”可匹配目标序列“ab”,但不匹配目标序列“a~”。

在awk中,元素可以是下列项之一:

“\\”、“\a”、“\b”、“\f”、“\n”、“\r”、“\t”或“\v”形式的文件格式转义。 它们分别匹配目标序列中的反斜杠、警报符、退格符、换页符、换行符、回车符、水平制表符和垂直制表符。

“\ooo”形式的八进制转义序列。 可匹配目标序列中由一个、两个或三个八进制数字ooo的值表示的字符。

重复

肯定断言、否定断言或定位点之外的任何元素都可以后接一个重复计数。最常见的重复计数采用“{min,max}”形式,或者在BRE和grep中采用“\{min,max\}”形式。后跟这种重复计数形式的元素可至少匹配min次连续出现的与该元素相符的序列,最多不超过max次。例如,“a{2,3}”可匹配目标序列“aa”和目标序列“aaa”,但不匹配目标序列“a”或目标序列“aaaa”。

重复计数也可以采用以下形式之一:

“{min}”,或BRE和grep中的“\{min\}”。 等效于“{min,min}”。

“{min,}”,或BRE和grep中的“\{min,\}”。 等效于“{min,无限大}”。

“*”。 等效于“{0,无限大}”。

示例:

“a{2}”可匹配目标序列“aa”,但不匹配目标序列“a”或目标序列“aaa”。

“a{2,}”可匹配目标序列“aa”、目标序列“aaa”,以此类推,但不匹配目标序列“a”。

“a*”可匹配目标序列“”、目标序列“a”、目标序列“aa”,以此类推。

对于除BRE和grep外的所有语法,重复计数还可以采用以下形式之一:

“?”。 等效于“{0,1}”。

“+”。 等效于“{1,无限大}”。

示例:

“a?”可匹配目标序列“”和目标序列“a”,但不匹配目标序列“aa”。

“a+”可匹配目标序列“a”、目标序列“aa”,以此类推,但不匹配目标序列“”。

在ECMAScript中,所有形式的重复计数都可以后跟字符“?”,用于指定非贪婪重复。

串联

无论是否后跟重复计数,正则表达式都可以串联成较长的正则表达式。 由此产生的表达式可匹配由分别与各个元素相符的序列串联而成的目标序列。例如,“a{2,3}b”可匹配目标序列“aab”和目标序列“aaab”,但不匹配目标序列“ab”或目标序列“aaaab”。

替换

在除BRE和grep外的所有正则表达式语法中,串联正则表达式可后跟字符“|”以及另一个串联正则表达式。通过这种方式,可以组合任意数量的串联正则表达式。由此产生的表达式可匹配与一个或多个串联正则表达式相符的任意目标序列。

当多个串联正则表达式与目标序列匹配时,ECMAScript会选择第一个与序列匹配的串联正则表达式作为匹配项(第一匹配);其他正则表达式语法将选择达到最长匹配的串联正则表达式。例如,“ab|cd”可匹配目标序列“ab”和目标序列“cd”,但不匹配目标序列“abd”或目标序列“acd”。

在grep和egrep中,换行符(“\n”)可用来分隔分支结构。

子表达式

在BRE和grep中,子表达式是一种串联。 在其他正则表达式语法中,子表达式是一种分支结构。

在头文件<regex>中包含了多个我们使用正则表达式时需要用到的组件,大致有:

basic_regex

正则表达式对象,是一个通用的模板,有typedef basic_regex<char> regex 和 typedef basic_regex<char_t>wregex;

regex_match

将一个字符序列和正则表达式匹配

regex_search

寻找字符序列中的子串中与正则表达式匹配的结果,在找到第一个匹配的结果后就会停止查找

regex_replace

使用格式化的替换文本,替换正则表达式匹配到字符序列的地方

regex_iterator

迭代器,用来匹配所有的子串

match_results

容器类,保存正则表达式匹配的结果。

sub_match

容器类,保存子正则表达式匹配的字符序列.

构造正则表达式

构造正则表达式用到一个类:basic_regex。Basic_regex是一个正则表达式的通用类模板,对char和wchar_t类型都有对应的特化。

Typedef basic_regex<char>  regex;

typedef basic_regex<wchar_t> wregex;

0 0
原创粉丝点击