通配符(?,*)与正则表达式

6 篇文章 50 订阅
2 篇文章 0 订阅

目录

一、简介

二、目的

三、普通字符和元字符

1.普通字符

2.元字符(特殊字符)

(1)常用元字符

(2)表重复的元字符

 (3)分组和转义

 (4)条件或、区间

三、捕获和断言

四、总结


一、简介

        我们可能只对通配符比较熟悉,例如通配符 "?"和 " * ",但是这样只是简单的匹配,对于更复杂的匹配字符串功能就需要用到正则表达式。

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串

      正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

例如:

  • runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)

  • runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。

  • colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)

二、目的

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”):

2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

三、普通字符和元字符

1.普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母(a-z,A-Z)、所有数字(0-9)、所有标点符号和一些其他符号

[ABC]匹配 [...] 中的所有字符,例如 [aeiou] 匹配字符串 "google runoob taobao" 中所有的 e o u a 字母。
[^ABC]匹配除了 [...] 中字符的所有字符,例如 [^aeiou] 匹配字符串 "google runoob taobao" 中除了 e o u a 字母的所有字母。
[A-Z][A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。
[\s\S]匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。
.匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]。
\w匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

2.元字符(特殊字符)

元字符是构造正则表达式的一种基本元素,要想真正的用好正则表达式,正确的理解元字符是最重要的事情。

(1)常用元字符

\d匹配一个数字字符。等价于[0-9]。

\D

匹配一个非数字字符。等价于[^0-9]。

\b匹配单词的开始或结束

^

匹配字符串的开始

$

匹配字符串的结尾。

(2)表重复的元字符

*

匹配前面的子表达式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等价于{0,}。

+

匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

?

匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”。?等价于{0,1}。

{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}

mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

 (3)分组和转义

*限定符是作用在与他左边最近的一个字符,正则表达式中用小括号()来做分组,也就是括号中的内容作为一个整体。

匹配字符串中包含0到多个ab开头:

 ^(ab)*

 如果要匹配的字符串中本身就包含小括号():在要转义的字符前面加个斜杠,也就是\即可

^(\(ab\))*

 (4)条件或、区间

正则用符号 | 来表示或,也叫做分支条件,当满足正则里的分支条件的任何一种条件时,都会当成是匹配成功。

正则提供一个元字符中括号 [] 来表示区间条件。如前面提到的:

  1. 限定0到9 可以写成[0-9]
  2. 限定A-Z 写成[A-Z]
  3. 限定某些数字 [165]

三、捕获和断言

(pattern)

匹配pattern并获取这一匹配。

(?:pattern)

非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分时很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

(?=pattern)

非获取匹配,正向肯定预查(断言),在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

(?<=pattern)

非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

*python的正则表达式没有完全按照正则表达式规范实现,所以一些高级特性建议使用其他语言如java、scala等

(?<!pattern)

非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。

*python的正则表达式没有完全按照正则表达式规范实现,所以一些高级特性建议使用其他语言如java、scala等

四、总结

.

[ ]

^

$

四个字符是所有语言都支持的正则表达式,所以这四个是基础的正则表达式。正则难理解因为里面有一个等价的概念,这个概念大大增加了理解难度,让很多初学者看起来会懵,如果把等价都恢复成原始写法,自己书写正则就超级简单了,就像说话一样去写你的正则了:

等价:

等价是等同于的意思,表示同样的功能,用不同符号来书写。

?,*,+,\d,\w 都是等价字符

?等价于匹配长度{0,1}

*等价于匹配长度{0,}

+等价于匹配长度{1,}

\d等价于[0-9]

\D等价于[^0-9]

\w等价于[A-Za-z_0-9]

\W等价于[^A-Za-z_0-9]。

常用运算符与表达式:

^ 开始

() 域段

[] 包含,默认是一个字符长度

[^] 不包含,默认是一个字符长度

{n,m} 匹配长度

. 任何单个字符(\. 字符点)

| 或

\ 转义

$ 结尾

[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数字

参考链接:

你是如何学会正则表达式的? - 知乎 https://www.zhihu.com/question/48219401

正则表达式_百度百科

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值