正则表达式简述

正则表达式
因为要做一个手机号校验的一个规则,并且作为程序员平常也都有可能用到,所以就研究下正则表达式。
又称规则表达式。(英语: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(".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值