正则表达式
因为要做一个手机号校验的一个规则,并且作为程序员平常也都有可能用到,所以就研究下正则表达式。
又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE)
,计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”):
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
等价:
等价是等同于的意思,表示同样的功能,用不同符号来书写。
?,*,+,\d,\w 都是等价字符
?等价于匹配长度{0,1} 出现0或1次
*等价于匹配长度{0,} 出现0至多次
+等价于匹配长度{1,} 至少出现1次
\d等价于[0-9]
\D等价于[^0-9]
\w等价于[A-Za-z_0-9]
\W等价于[^A-Za-z_0-9]。
常用运算符与表达式:
^ 开始
()域段
[] 包含,默认是一个字符长度
[^] 不包含,默认是一个字符长度
{n} n 是一个非负整数,匹配确定n次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数,至少匹配n次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} 匹配长度m和n均为非负整数,其中n<=m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
. 任何单个字符(\. 字符点)
| 或
\ 转义
$ 结尾
[A-Z] 26个大写字母
[a-z] 26个小写字母
[0-9] 0至9数字
[A-Za-z0-9] 26个大写字母、26个小写字母和0至9数字
, 分割
分割语法:
[A,H,T,W] 包含A或H或T或W字母
[a,h,t,w] 包含a或h或t或w字母
[0,3,6,8] 包含0或3或6或8数字
语法与释义:
基础语法 "^([]{})([]{})([]{})$"
正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束"
?,*,+,\d,\w 这些都是简写的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)这种特殊组合情况下除外。
初学者可以忽略?,*,+,\d,\w一些简写标示符,学会了基础使用再按表自己去等价替换
实例:
字符串;tel:086-0666-88810009999
原始正则:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"
速记理解:开始 "tel:普通文本"[0-9数字]{1至3位}"-普通文本"[0数字][0-9数字]{2至3位}"-普通文本"[0-9数字]{8至11位} 结束"
等价简写后正则写法:"^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$" ,简写语法不是所有语言都支持。
简单的国内手机号正则表达式 "^[1][0-9]{10}$"
等价简写:"^[1]\d{10}$"
理解:第一个数字是1,之后的十位数是0到9之间的数。
vc++简单实现
#include<regex>
static bool checkmobile(std::string const &mobilenumber)
{
bool ret= false;
std::regex e("^[1][0-9]{10}$");
if (std::regex_match(mobilenumber.c_str(), e)){
ret= true;
}
return ret;
}
判断正则表达式是否符合规则
#include <regex>
#include <iostream>
bool checkmobile(const char * mobilenumber,const char *regex)
{
bool ret= false;
std::regex e(regex);
if (std::regex_match(mobilenumber, e)){
ret= true;
}
return ret;
}
int main(int argc, char* argv[]){
std::cout << checkmobile(argv[2],argv[1]) << std::endl;
return 0;
}
./a.out ".*?[a-z]+.*?" "387777s"
str:要判断的字符
1.判断字符串是否包含字母,数字符号
str.matches("^(?:(?=.*[0-9].*)(?=.*[A-Za-z].*)(?=.*[\\W].*))[\\W0-9A-Za-z]{8,16}$")
2.判断字符串是否包含大写字母
str.matches(".*[A-Z]+.*")
3.判断字符串是否包含小写字母
str.matches(".*[a-z]+.*");
4.判断字符串是否包含字符
str.matches(".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*");