从零开始学习正则表达式,一篇搞定!(超全面极速版)

本文详细介绍了正则表达式的概念、字符基础、修饰符的使用、贪婪匹配与惰性匹配的区别,以及列举了多个实用的正则表达式示例,涵盖了验证数字、字母、日期、电话号码等多种场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)正则表达式简介

正则表达式是由一些具有特殊含义的字符组成的字符串,是由字母和符号组成的特殊文本,它可以用来从文本中查找、替换符合规则的字符串。在表单验证、Url映射等处都会经常用到。

一个正则表达式匹配主体字符串的模式是从左到右

正则表达式也称为"Regular expression",通常简称为"regex" "regexp"

(二)正则表达式字符基础

  1. 字面量:字面量是指直接匹配特定字符本身的内容,例如 ‘a’ 就是一个字符字面量,表示匹配字符’a’。在正则表达式中,可以使用字面量来匹配精确的字符内容。

  2. 元字符:元字符是具有特殊含义的符号,用来描述字符串模式的特性。例如,^ 表示匹配字符串的开头,$ 表示匹配字符串的结尾,* 表示零个或多个匹配,+ 表示一个或多个匹配,? 表示零个或一个匹配。
     

    代码含义代码含义
    ^字符串的开始
    $字符串的结束
    \s空白符号(空格 tab等)\S非空白符
    \b单词的开始或结束\B非单词开头和结尾
    \d数字\D非数字
    |w数字+字母+汉字+下划线\W非数字、字母、汉字、下划线
    .全部(除了换行符)
    []字符种类,匹配括号内的字符(选其一即可)[^abc]除了abc以外的字符
    (xyz)字符集,匹配与符号完全相等的字符串
    |

    或运算符

    \n换行符
    \r回车符
    \t制表符
    \v垂直制表符
  3. 量词元字符
     

    代码含义
    *>=0次
    +>=1次
    0/1次

    {n}

    =n次
    {n,}>=n次
    {n,m}n<= 次数  <=m

    与元字符结合起来,举例:
    \d{8}  八个数字,例如12345678等
    \d{3,5} 三到五个数字,例如456,8523,31256等

  4. 转义元字符
    上面已经说到,元字符在正则表达式中有自己的含义,但如果我们想要匹配的就是元字符本身呢?

    这时候就用到转义元字符了,用\加上需要匹配的元字符,就可以表示字符原意
    比如:\.  \*   \+等

  5. 分组和引用元字符:包括()和\1、\2等,用来对一组字符进行分组和随后的引用。用小括号()可以将一组字符作为一个整体,并且可以在匹配成功后获取组的匹配结果。通过\1、\2等可以在替换时引用已经捕获的组的内容。
    例如,(abc)\1表示匹配两次连续出现的abc字符串。

    (\d\w){3} 重复匹配3次(\d\w)
     

  6. 反向引用元字符:包括\1、\2等,用来在正则表达式中引用之前捕获到的内容。通过在替换时使用\1、\2等,可以引用之前捕获的组内容。例如,(\d{3})-(\d{3})-\1\2表示匹配形如123-456-123456的字符串。
    举例:
    表示给定一个非空的数字串,如123456789,请将其每隔4位插入一个空格,变为1234 5678 9。代码如下
    string insertSpace(const string& str) {
        regex pattern("(\\d{4})");
        string result = regex_replace(str, pattern, "$1 ");
        return result;
    }

(三)正则表达式修饰

g表示全局搜索,返回所有匹配值
i表示不区分大小写
m多行修饰符

(四)贪婪匹配和惰性匹配

所谓贪婪匹配,指的是尽量匹配较长的子串,如"/(.*o)/"  在 hellohello中,会匹配到最后一个o。
惰性匹配指的是,匹配尽量小的子串,如"/(.*o)/"  在 hellohello中,会匹配到第一个o就停止匹配。

(五)常用的正则表达式

       数字:"^[0-9]*$"。

  n位的数字:"^"d{n}$"。

  至少n位的数字:"^"d{n,}$"。

  m~n位的数字:。"^"d{m,n}$"

  零和非零开头的数字:"^(0|[1-9][0-9]*)$"。

  有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。

  有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。

  非零的正整数:"^"+?[1-9][0-9]*$"。

  非零的负整数:"^"-[1-9][]0-9"*$。

       非负整数:^\d+$ 或 ^[1-9]\d*|0$

       非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

       非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

       非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

        正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

        负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

        浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

  长度为3的字符:"^.{3}$"。

  由26个英文字母组成的字符串:"^[A-Za-z]+$"。

  由26个大写英文字母组成的字符串:"^[A-Z]+$"。

  由26个小写英文字母组成的字符串:"^[a-z]+$"。

  由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。

  由数字、26个英文字母或者下划线组成的字符串:"^"w+$"。

  验证用户密码:"^[a-zA-Z]"w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

  验证是否含有^%&’,;=?$""等字符:"[^%&’,;=?$"x22]+"。

  只能输入汉字:"^["u4e00-"u9fa5]{0,}$"

  验证Email地址:"/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/"。

  验证InternetURL:"^http://(["w-]+".)+["w-]+(/["w-./?%&=]*)?$"。

  验证电话号码:"^("("d{3,4}-)|"d{3.4}-)?"d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

  验证身份证号(15位或18位数字):"^"d{15}|"d{18}$"。

  验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。

  验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
                        
此处借鉴原文链接:https://blog.csdn.net/xuemoyao/article/details/8033138
                        
原文链接:https://blog.csdn.net/xuemoyao/article/details/8033138

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值