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

正则表达式(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 如果不符合则返回false
	if ( 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值