日志 c/c++ 正则表达式 regex

来源:互联网 发布:千兆网络测速工具 编辑:程序博客网 时间:2024/05/19 16:49

正则表达式(regular expression) 是对于字符串匹配的一种方法。

   正则表达式可以用来检查一个字符串是否含有某种子字符串,将匹配的子字符串替换,或者从某个串中取出符合某种条件的子字符串。

   在c中一般用regex这个类来使用的。 很多接口都封装的这个类中


1、正则表达式的基本语法

1.1 特殊含义的字符

    ^  指出一个字符串的开始   例如 "^hello" 表示以hello开始的字符串,“hello 妹子”, "hello 软妹子" 都是符合定出的规则

   $ 指出一个字符串的结束    例如“嘿嘿黑$" 表示一嘿嘿嘿结尾的字符串, 例如”呵呵嘿嘿嘿“,”hello 嘿嘿嘿“

    *  表示没有或者多个   “hello*” 表示一个字符串中含有一个子串是累似于 “hello”, “hellooo”, “helloooo.....”等等

    + 表示后面有至少一个以上

    ?  表示字符串hell后面跟着0个或者一个o

同时大括号可以决定后面跟几个

    “ma{3}”  表示一个字符串有一个m跟着3个a   “maaa”

    “ma{3,}” 表示一个字符串有一个m后面至少跟了3个a   类似与 +

    ”ma{3,6}“表示一个字符串有一个m后面有3到6个a


    |  或操作

    ”meizi | ruanmeizi“  表示一个字符串有”meizi“ 或者 "ruanmeizi" 这两个字符串

   ”(b | cd) ef“   表示某个字符串有”bef"  或者 ”cdef“ 这两个字符串

    ”(a "| b) * c)“   表示c前面有 0 | n 个 a | c   例如"ac",”abc“, "aac", "ababc".....


    . 可以替代任何字符

    ”a.[0-9]“  表示一个字符串有一个”a" 后面跟着一个任意字符和一个数字;

    "^.{3}$"表示有任意三个字符的字符串(长度为3个字符)


   []方括号表示某些字符云逊在一个字符串中的某一特定位置出现:

   "[ab]" 表示一个字符串有一个”a“ 或 ”b“ (相当于”a | b“)

   "[a-d]" 表示一个字符串包含小写的”a” 到 “d“中的一个(相当于 "a|b|c|d" 或者 ”[abcd]")

   "^[a-zA-Z]"表示一个以字母开头的字符串

   “[0-9]%”表示一个百分号前有一位的数字

   “,[a-zA-Z0-9]$”表示一个字符串以一个都好后面跟着一个字母或数字结束

   你也可以在方括号里用‘^’表示不希望出现的字符,‘^’应在方括号里的第一位

   “%[^a-zA-Z]%” 表示两个百分号中不应该出现字母


1.2 字符集

”^(\d){1}$“表示一个字符为10进制的数字

"^(\l){1}$"表示一个字符为小写的字符

"^(\s){1}$"表示一个字符的空白符

"^(\u){1}$"表示一个字符的大写字母

"^(\w){1}$"一个字母 a~z A~Z 或者数字 0~9 或者下划线

"^(\D){1}$"除了 \d的之外字符

”^(\L){1}$“除了\l的之外字符

"^(\S){1}$"除了\s的之外字符

"^(\U){1}$”除了\u的之外字符

"^(\W){1}$"除了'w之外的字符


2、正则表达式的应用事例通俗说明

2.1 校验是否全由数字组成

“^[0-9]{1,20}$”

^ 表示大头的字符要匹配紧跟^后面的规则

$ 表示大头的字符要匹配紧靠$前面的规则

[] 中的内容是可选字符集

[0-9] 表示要求字符范围在0-9 之间

{1,20} 表示数字字符串长度合法为1到20, 即为[0~9]中的字符出现次数的范围是1到20次

^ 和 $ 成对使用表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串

2.2 校验登录名:只能输入5~20个以字母开头、可带数字、“_"、”." 的子串

”^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$“

^[a-zA-Z]{1} 表示第一个字符要求是字母

([a-zA-Z0-9]|[._]){4,19}表示从第二位开始(因为他金庚在上个表达式后面)的一个长度为4到19为的字符串,他要求是有大小写字母、数字或者特殊字符集[._]组成


2.3  校验用户名: 只能输入1~30个以字母开头的子串

"^[a-zA-Z]{1,30}$"


2.4 校验密码:只能输入6-20个字母、数字、下划线

"^(\w){6,20}$"


3、 关于c++的正则表达式的用法

下面这个事例是最简单的用法。  大家就举一反三吧

#include <iostream>#include <regex>using namespace std;int main(){// 代表是0到9的数字  长度在3到10个字符之间regex pattern("^[0-9]{3,10}$");// regex_match() 是比较的 如果符合就返回true 如果不符合则返回falseif ( regex_match("24312k",pattern)== false){printf("this string is not conform\n");}if ( regex_match("12345543", pattern) == false){printf("this string is not conform\n");}printf("this string is conform\n");getchar();return 0;}

从示例程序可以看出 先声明一个regex类型的对象,并通过构造函数来定义规则,  之后只要调用regex_match来进行匹配, 如果匹配成功则返回true,如果匹配不成功则返回false。  


4、 Regular Expression 的内部实现

关于Regular Expression的实现, 用到了不少的自动机理论(Automata Theory)的只是, 有兴趣的可以找这方面的资料来看,这本书"Introduction to Automata Theory, Languages, and Computation" 写的很好, 编译远离的书也有这方面的内容

    

   















0 0
原创粉丝点击