正则表达式

1 概念

  • 英文名:Regular Expression(regex
  • 是一个字符串,用以匹配一系列符合某个句法规则的字符串。
    注意:要按照字符来理解正则表达式。如:
    ^cat应理解为:匹配 行开始,紧接着一个c,紧接着一个a,紧接着一个t的文本。
    不要理解为:匹配以cat开头的行。 (后续为简化说法,还会采用该说法,但应按字符理解)

2 语法规则

  • 字符组
    [...]:允许使用者列出在某处期望匹配的字符。(
    如:[abc]表示匹配a或b或c字符。

    • 字符组元字符
      • -:表示一个范围,如[0-9]表示所有数字,gr[ae]y匹配gray或grey。
      • ^:表示排除,如[^0-9]表示匹配排除数字后的所有字符。

    注意:字符组里面和外面,元字符的意义是不一样的。

  • 元字符(字符组外面)

    • ^:代表行的开始
    • $:代表行的结束
    • $1$2:代表前面匹配成功的字符串。
    • .:匹配任意字符。
    • ():表示一个元素,可以是字符也可以是字符串。
    • |:或,多选结构,如:grey|gray,也可以表示成gr(a|e)y
    • ?:可选项,作用于前一紧邻元素,如colou?r表示u可有可没有。
    • +:计数,表示前一紧邻元素至少出现一次。
    • *:计数,表示前一紧邻元素出现任意多次或未出现。
    • {min,max}:表示前一紧邻元素出现次数范围。
    • \char:转义符,其作用的char元字符会失去特殊含义,如:\\, \t, \r, \d, \.
    • \<:单词分界符,单词开始位置,如\<cat匹配cat开头的单词。
    • \>:单词分界符,单词结束位置。(部分egrep不支持单词分界符)

3 常用文本结构示例

  • 任意英文字符:[!-~](包括数字、字母和英文特殊字符)
  • 变量名:[a-zA-Z_][a-zA-Z_0-9]*(变量名不能以数字开头)
  • 引号内字符串:"[^"]*"(排除双引号)
  • 美元金额:\$[0-9]+(\.[0-9]*)?(可能包含小数)
  • 邮箱地址:\w+@[0-9a-zA-Z]+(\.[a-z]{2,3})+
  • URL:\<http://[a-z0-9][-a-z0-9_.:]+/[-a-z0-9_:@&?=+,./~*%$]*\.html?\>
  • 时刻:([01]?[0-9]|2[0-3]):[0-5][0-9](24小时制)
字符含义
x代表字符x(区分大小写)
\ 转义字符
\t制表符
\n换行符
\r回车符
\d代表数字0-9,相当于[0-9]
\D代表非数字0-9,相当于[^0-9]
\w代表字母或数字或下划线(单词字符),相当于[a-zA-Z0-9]
\s匹配所有空白字符,包括空格、制表符、回车符、换页符、换行符等
\uhhhh十六进制0xhhhh所表示的Unicode字符
\b代表边界,如\b[abc]\b表示字母a或b或c的左右两边都要是非单词字符
[abc]表示范围,代表的是字符a或b或c
^
排除,如[^abc]表示除了a,b,c以外的任何字符
代表行的开头,如^[abc]表示匹配字符需要是[abc]开头
$表示行的结尾,如[0-9]$表示匹配字符需要是[0-9]结尾
-连续字符表示,如[0-9]表示0到9的数字,[a-zA-Z]表示a到z和A-Z的字符
.代表任意字符
数量词
x?表示x出现[0,1]次
x*表示x出现0次或多次
x+表示x出现[1,+∞)次
x{n}表示x恰好出现n次
x{n,}表示x至少出现n次
x{n,m}表示x出现[n,m]次

4 环视功能

  • 环视(lookaround)结构不匹配任何字符,只匹配文本中的特定位置
  • 顺序环视——从左至右查看文本
    • 肯定顺序环视:(?=...)能够匹配右侧文本。
      如:正则表达式(?=Jeffrey),匹配标记的位置:

      (?=Jeffrey)JeffJeff(?=rey)是等价的。
    • 否定顺序环视:(?!...)不能匹配右侧文本。
  • 逆序环视——从右至左查看文本
    • 肯定逆序环视:?<=...能够匹配左侧文本。

    • 否定逆序环视:?<!...不能匹配左侧文本。
      环视结构示例1:将"see Jeffs book"修改为"see Jeff’s book"

      s/(?<=\bJeff)(?=s\b)/'/g  //等价于: s/(?=s\b)(?<=\bJeff)/'/g
      

      环视结构示例2:将"The popolation is 7084442151 in the earth!"中的数字以逗号分开,即7,084,442,151

      s/(\d)(?=(\d\d\d)+(?!\d))/$1,/g
      

      环视结构示例3:包含特殊字符、数字和字母,长度为8~16位,其中特殊字符可以不存在,数字和字母最少一个。(类似密码格式验证)

      ^(?=.*[0-9a-zA-Z])[!-~]{8,16}$
      
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值