入侵检测常用正则表达式手册

原创 橙留香Park 2022-09-13 02:00

本篇文章遇到排版混乱的地方,可点击文末阅读原文或前往该地址:https://orangey.blog.csdn.net/article/details/123002359

更多关于Android安全的知识,可前往:https://blog.csdn.net/ananas_orangey/category_11955914.html


0x01 前言

关于正则表达式,很多人认为,使用的时候查询下就行,没必要深入学习,但是知识与应用永远都是螺旋辩证的关系,有需要查询也无可厚非,但是先掌握知识,可以让应用更创新,更深入,超越他人,必须要先掌握大量的深刻的知识。

但是学习正则并非易事:知识点琐碎、记忆点多、符号乱,难记忆、难描述、广而深且,说了那么多,开始正文吧

正则表达式又称规则表达式,计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本,是对字符串操作的一种逻辑公式,是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

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

正则表达式使用一种符号系统,允许以最小的努力匹配复杂的文本模式。虽然对于正则表达式的语法没有正式的标准化,但是对于语法的基本元素有一个普遍的共识

正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索、替换、匹配验证、在HTML里提取想要的信息都是简简单单的事

例如,Windows下用于文件查找的通配符(wildcard),也就是*和?。如果想查找某个目录下的所有的Word文档的话,搜索*.doc。在Windows这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求

  • 例1:匹配以数字开头,并以 abc 结尾的字符串

  ^    [0-9]    +      abc     $
定位符 字符集 限定符 普通字符 限定符
  • 例2:

[a-zA-z]+://[^\s]*

PS:上面是正则表达式的特定语法规则组合,通过这些组合,就可以得到想要的字符,例如,\s表示匹配任意的空白字符,*代表匹配前面的字符任意多个等等。常用的匹配字符规则如下表:

模式描述
\l把下一个字符转换为小写
\L\L\E之间的字符全部转换为小写
\u把下一个字符转换为大写
\U\U\E之间的字符全部转换为大写
\w匹配字母、数字及下划线
\W匹配不是字母、数字及下划线的字符;匹配任意不是字母,数字,下划线,汉字的字符
\s匹配任意空白字符,相当于{\t\n\r\f}
\s*$匹配一个字符串的结尾位置零个或多个空白字符
\S匹配任意非空白字符;匹配任意不是空白符的字符
\d匹配任意数字,等价于[0-9]
\D匹配任意非数字字符
\A匹配字符串开头
\Z匹配字符串的结尾,如果存在换行,只匹配到换行前的字符串
\z匹配字符串的结尾,如果存在换行,同时还会匹配换行符
\G匹配最后完成匹配的位置
\B匹配不是单词开头或结束的位置
\b指定单词的边界,用来匹配一个单词的开头和结尾;匹配且只匹配一个位置,不匹配任何字符
\f换页符
\n匹配换行符
\t匹配制表符
\r回车符
\v垂直制表符
\v垂直制表符
\1…\9匹配第n个分组的内容
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式
\E结束\L\U转换
\p匹配CR/LF (等同于 \r\n),用来匹配 DOS 行终止符
\转移字符,将后一个字符标记为一个特殊字符
^匹配一行字符串的开头;匹配输入字串的开始位置
^\s*匹配一个字符串的开头位置和随后的零个或多个空白字符
$匹配一行字符串的结尾;匹配输入字串的结束位置
$1、$2、...、$99与 regexp 中的第 1 到第 99 个子表达式相匹配的文本
$&与 regexp 相匹配的子串
$`位于匹配子串左侧的文本
$'位于匹配子串右侧的文本
$$直接量符号
.匹配除换行符外的任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符;匹配到除"\n"之外的所有单个字符
[…]用来表示一组字符单独列出,比如[amk]匹配a,m,k;表示一个字符集,可以单个列出,如[amk$];也可以加一个"-"表示一个字符范围,如[a-z];匹配任意一个字符即可;也可以用补集来匹配不在区间范围内的字符。其做法是把""作为类别的首个字符;其它地方的""只会简单匹配""字符本身,例如[5] 将匹配除"5"之外的任意字符;代表多选一,比如[abc]可以匹配到字母a,也可以匹配到字母b或c
[a-z]匹配a到z之间的任意元素,\w这个通配符就可以用【a-zA-Z0-9_】来表示
[^a-n]补集,匹配除 "a" 到 "n" 的其他字符
[^…]否定的字符种类. 匹配除了方括号里的任意字符;不在[]中的字符,比如^abc,表示匹配除了a,b,c之外的字符;取反,不能是括号内的任意单个元素
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符
*匹配0个或多个表达式;匹配前面的子表达式0次或多次
*?重复任意次,但尽可能少重复
+匹配1个或多个表达式;匹配前面的子表达式1次或多次
+?重复1次或更多次,但尽可能少重复
匹配0个或1个前面正则表达式定义的片段(非贪婪匹配);匹配前面的子表达式0次或1次;如果打算同时使用[] 和 ?,千万记得应该把?放在字符集合的外面
?=正先行断言-存在
?!负先行断言-排除
?<=正后发断言-存在
?负后发断言-排除
??重复0次或1次,但尽可能少重复
{n}精确匹配n个前面的表达式
{n,}重复n次或更多次
{n,}?重复n次以上,但尽可能少重复
{n,m}匹配n到m次,由前面正则表达式匹配的片段(贪婪匹配);匹配至少n次,至多m次
{n,m}?重复n到m次,但尽可能少重复
a\|b匹配a或b
( )匹配括号内的表达式,也表示一个组;代表把子表达式当做一个独立元素,子表达式允许多重嵌套,但在实际工作中一个遵循适可而止的原则
(?=)正向前查找
(?!)负向前查找
(?<=)正向后查找
(?exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?负向后查找
(?m)分行模式匹配
(?imx)正则表达式包含三种可选标志:i, m, 或 x。只影响括号中的区域
(?-imx)正则表达式关闭i, m, 或 x可选标志。只影响括号中的区域
(?: re)类似(…),但是不表示一个组;匹配re,不捕获匹配的文本,也不给此分组分配组号
(?imx: re)在括号中使用i, m, 或 x可选标志
(?-imx: re)在括号中不使用i, m, 或 x可选标志
(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
(?= re)前向肯定界定符。如果所含正则表达式,以表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边
(?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)匹配的独立模式,省去回溯
\r\nWindows 所使用的文本行结束标签
\n\n在 Linux 上匹配空白行使用
\r\n同时适用于 Windows 和 Linux 的正则表达式应该包含一个可选的 \r 和一个必须被匹配的 \n
\x十六进制(逢16进1)数值要用前缀\x来给出
\0八进制(逢8进1)数值要用前缀\0来给出
|替换字符,匹配|前或后的表达式;表示逻辑 或 操作符
x\|y匹配 x 或 y。例如,'z|food'匹配"z"或"food"'(z|f)ood'匹配"zood"或"food"
  • 标志

标志也叫模式修正符,因为它可以用来修改表达式的搜索结果。这些标志可以任意的组合使用,它也是整个正则表达式的一部分

标志描述
i忽略大小写
g全局搜索
m多行的:锚点元字符^ $工作范围在每行的起始
  • 运算符优先级:

优先级为从上到下,依次降低:

运算符说明优先级
\转义符最高
()、(?:)、(?=)、[]括号和中括号
*、+ 、? 、{n} 、{n,} 、{n,m}限定符
^、$ 、\任何元字符定位点和序列
|选择最低
  • 正则表达式的工作机制

写的任何一个正则直接量或者 RegExp 都会被浏览器编译为一个原生代码程序。第一次匹配是从头个字符开始,匹配成功时,他会查看是否还有其他的路径没有匹配到,如果有的话,回退到上一次成功匹配的位置,然后重复第二步操作,不过此时开始匹配的位置(lastIndex)是上次成功位置加 1

    |  编译  |

+--------+

|



+----------------+

| 设置开始位置 |---------+

+----------------+

| |

↓ 其 |

+----------------+|

| 匹配 & 回溯 ||

+----------------+|

| |

|

+----------------+ |

| 成功
or
失败 |---------+

+----------------+

在爬虫以及处理数据包中,用得最多的匹配字符,如下:

  • .:匹配除换行符外的任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符;匹配到除"\n"之外的所有单个字符

  • *:匹配0个或多个表达式;匹配前面的子表达式0次或多次

  • ?:匹配0个或1个前面正则表达式定义的片段(非贪婪匹配);匹配前面的子表达式0次或1次

  • ():匹配括号内的表达式,也表示一个组

  • \d:匹配任意数字,等价于[0-9]

  • {n}:精确匹配n个前面的表达式

  • $:匹配一行字符串的结尾;匹配输入字串的结束位置

  • ^:匹配一行字符串的开头;匹配输入字串的开始位置

  • \b回退(删除)一个字符

代表着单词的开头或结尾,也就是单词的分界处

例1:匹配orangey

\borangey\b

虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

例2:匹配orangey后面的blog

\borangey\b.*\bblog\b

PS:上面正则中.是另一个元字符,匹配除了换行符以外的任意字符。*同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。现在\borangey\b.*\bblog\b的意思:先是一个单词orangey,然后是任意个任意字符(但不能是换行),最后是blog这个单词

PS:如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w

正则表达式的语法很令人头疼,即使对经常使用它的人来说也是如此。由于难与读和写,容易出错,利用工具对正则表达式进行测试是否正确,是很需要的,如下是正则表达式在线校验工具:

https://c.runoob.com/front-end/854

https://tool.oschina.net/regex#

https://regex101.com 能可视化展示正则匹配结果

https://regexper.com 能够直观展示正则表达式的状态机图

  • 正则表达式在线编写教程文档

https://ihateregex.io

https://github.com/geongeorge/i-hate-regex

https://deerchao.cn/tutorials/regex/regex.htm

https://blog.csdn.net/lxcnn

https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md

  • Python正则表达HOWTO 学习教程

https://docs.python.org/zh-cn/3.7/howto/regex.html#regex-howto

0x02 发展过程

2.1 20世纪40年代

正则表达式最初的想法来自两位神经学家:沃尔特·皮茨与麦卡洛克,他们研究出了一种用数学方式来描述神经网络的模型

2.2 20世纪50年代

一位名叫Stephen Kleene的数学科学家发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语

2.3 20世纪60年代

C语言之父、UNIX之父肯·汤普森把这个“正则表达式”的理论成果用于做一些搜索算法的研究,他描述了一种正则表达式的编译器,于是出现了应该算是最早的正则表达式的编译器qed(这也就成为后来的grep编辑器)。

Unix使用正则之后,正则表达式不断的发展壮大,然后大规模应用于各种领域,根据这些领域各自的条件需要,又发展出了许多版本的正则表达式,出现了许多的分支。我们把这些分支叫做“流派”。

2.4 20世纪80年代

Perl语言诞生了,它综合了其他的语言,用正则表达式作为基础,开创了一个新的流派,Perl流派。

:Perl语言是一种擅长处理文本的语言,Larry在1987年创建,Practical Extraction and Report Language,实用报表提取语言,但因晦涩语法和古怪符号不利于理解和记忆导致很多开发人员并不喜欢

0x03 量词

在实际使用中,我们常常需要匹配同一类型的字符多次,比如匹配11位的手机号,我们不可能将 [0-9] 写11遍,此时我们可以使用Quantifiers来实现重复匹配

{n}:匹配 n 次
{n,m}:匹配 n-m 次
{n,}
:匹配 >=n 次
?:匹配 0 || 1
*:匹配 >=0 次,等价于 {0,}
+:匹配 >=1 次,等价于 {1,}

0x04 元字符

完整的正则表达式由两种字符构成:特殊字符(元字符)和普通字符。元字符表示正则表达式功能的最小单位,如* ^ $ \d等。正则表达式里还有更多的元字符,比如\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。\w匹配字母或数字或下划线或汉字等

元字符:

  • 基本元字符

  • 数量元字符

  • 位置元字符

  • 特殊元字符

4.1 基本元字符

在默认模式,匹配除了换行的任意字符。

  • \:转义特殊字符(允许你匹配'*','?',或者此类其他特殊字符)

  • []:用于表示一个字符集合

  • |A|B,A和B可以是任意正则表达式,创建一个正则表达式,匹配A或者B,任意个正则表达式可以用'|'连接。它也可以在组合内使用

  • -:可以表示字符范围,通过用'-'将两个字符连起来。比如[a-z]将匹配任何小写ASCII字符,[0-5][0-9]将匹配从00到59的两位数字,[0-9A-Fa-f]将匹配任何十六进制数位

  • ():匹配器整体为一个原子,即模式单元可以理解为多个原子组成的大原子

4.1.1 字符转义\

转义特殊字符(允许你匹配'*','?', 或者此类其他特殊字符),或者表示一个特殊序列;要牢记使用反斜杠\作为转义序列

例如,查找.或者*,得使用\来取消这些字符的特殊意义,使用\.\*。当然,要查找\本身,你也得用\\.

例如:

baidu\.com匹配baidu.cn
C:\\Windows匹配C:\Windows

4.1.2 字符集合[]

用于匹配字符集合中的任意一个字符,常见的字符集有:

  • [xyz]:匹配 "x"或"y"`"z"`

  • [^xyz]:补集,匹配除"x" "y" "z"的其他字符

  • [a-z]:匹配从"a" 到 "z"的任意字符

  • [^a-n]:补集,匹配除"a" 到 "n"的其他字符

  • [A-Z]:匹配从"A" 到 "Z"的任意字符

  • [0-9]:匹配从"0" 到 "9"的任意数字

比如匹配所有的字母和数字可以写成:/[a-zA-Z0-9]/或者/[a-z0-9]/i

字符可以单独列出,如下:

文本:awbwi  
正则:[bai]
运行结果:匹配'a''b',或者'i'

特殊字符在集合中,失去它的特殊含义。如[(+*)]只会匹配这几个文法字符'(', '+', '*', 或')'

因为已有了对应数字、字母、数字,空白这些字符集合的元字符,所以查找起来会很简单,但如果想匹配没有预定义元字符的字符集合(比如元音字母b,a,i,d,u),应该怎么办?

很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。

例1:匹配任何一个英文元音字母或

[baidu]

例2:匹配标点符号(.或?或!)

[.?!]

也可指定一个字符范围,像[0-9]代表的含意与\d是等价的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)

  • 更复杂的字符类表达式

\(?0\d{2}[) -]?\d{8}

PS:首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。这个表达式可匹配几种格式的电话号码,像(010)77779999,或022-44556677,或02912345678

例3:匹配从00到59的两位数字

文本:012234456789 
正则:[0-5][0-9]
运行结果:匹配'01''22''34',或者'45'

PS:可以表示字符范围,通过用'-'将两个字符连起来。比如[a-z]将匹配任何小写ASCII字符,[0-5][0-9]将匹配从00到59的两位数字,[0-9A-Fa-f]将匹配任何十六进制数位。如果-进行了转义(比如[a\-z])或者它的位置在首位或者末尾(如[-a]或[a-]),它就只表示普通字符'-'

字符类如\w或者\S在集合内可以接受,它们可以匹配的字符由ASCII或LOCALE模式决定

  • 例1:

匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)

\ba\w*\b
  • 例2:

匹配1个或更多连续的数字。这里的+是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次

\d+
  • 例3:

匹配刚好9个字符的单词

\b\w{9}\b

不在集合范围内的字符可以通过取反来进行匹配。如果集合首字符是'^',所有不在集合内的字符将会被匹配,比如[^5]将匹配所有字符,除了'5'[^^]将匹配所有字符,除了'^'.^如果不在集合首位,就没有特殊含义

  • 例4:

验证填写账号必须为3位到10位数字时

^\d{3,10}$

PS:元字符^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和\b有点类似。^匹配你要用来查找的字符串的开头,$匹配结尾

{3,10}的意思是重复的次数不能少于3次,不能多于10次,否则都不匹配

因为使用了^$,所以输入的整个字符串都要用来和\d{3,10}来匹配,也就是说整个输入必须是3到10个数字,如果输入的账号能匹配这个正则表达式的话,既满足要求;对于\d{3,10}而言,使用这样的方法就只能保证字符串里包含3到10连续位数字,而不是整个字符串就是3到10位数字。

和忽略大小写的选项类似,有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配行的开始处和结束处

  • 例5:

文本:TM1
正则:[^TM]
运行结果:1

4.1.3 任意正则表达式逻辑或|

A|B,A和B可以是任意正则表达式,创建一个正则表达式,匹配A或者B,任意个正则表达式可以用'|'连接。

它也可以在组合内使用。

扫描目标字符串时,'|'分隔开的正则样式从左到右进行匹配。当一个样式完全匹配时,这个分支就被接受。意思就是,一旦A匹配成功,B就不再进行匹配,即便它能产生一个更好的匹配。或者说'|'操作符绝不贪婪。如果要匹配'|'字符,使用|,或者把它包含在字符集里,比如[|]。

  • 例5:

文本:awe
正则:[a|w]
运行结果:匹配a或w

文本:wpdmw
正则:p|m
运行结果:匹配p或m

4.1.4 正则表达式(字符范围) -

-可以表示字符范围,通过用'-'将两个字符连起来。比如[a-z]将匹配任何小写ASCII字符,[0-5][0-9]将匹配从00到59的两位数字,[0-9A-Fa-f]将匹配任何十六进制数位。

例如:查找所有1-5之间的自然数

文本:012234456789 
正则:[1-5]
运行结果:匹配'1''2''2''3''4''4',或者'5'


<p data-line="468" class="sync-line" style="margin:0;">



PS:可以表示字符范围,通过用'-'将两个字符连起来。比如[a-z]将匹配任何小写ASCII字符,[0-5][0-9]将匹配从00到59的两位数字,[0-9A-Fa-f]将匹配任何十六进制数位。如果-进行了转义(比如[a\-z])或者它的位置在首位或者末尾(如[-a]或[a-]),它就只表示普通字符'-'

4.1.5 匹配括号内表达式()

匹配器整体为一个原子,即模式单元可以理解为多个原子组成的大原子

例如:查找所有1-5之间的自然数

文本:012234456789 
正则:([1-5])
运行结果:匹配'1''2''2''3''4''4',或者'5'


<p data-line="483" class="sync-line" style="margin:0;">



4.2 数量元字符

数量元字符:

  • *

  • +

  • ?

  • *?, +?, ??

  • {m}

  • {m,n}

  • {m,n}?

*,+,{5},{7,13}这几个匹配重复的方式了。下面表格是正则表达式中常用的限定符(指定数量的代码,例如*,{7,13}

  • 常用的限定符

模式描述
*匹配0个或多个表达式;匹配前面的子表达式0次或多次;代表出现0到多次,可以出现,也可以不出现,出现的话,不限制次数
+匹配1个或多个表达式;匹配前面的子表达式1次或多次;代表出现1到多次,也就是至少出现一次的意思
匹配0个或1个前面正则表达式定义的片段(非贪婪匹配);匹配前面的子表达式0次或1次;代表出现0到1次,比如Http协议的正则就可以用 Https? 表示
{n}精确匹配n个前面的表达式;代表出现n次,比如 a{1} 就表示匹配的规则中,字母a只能出现1次
{n,}重复n次或更多次;至少出现n次,{0,} 相当于星号,{1,} 相当于加号
{n,m}匹配n到m次,由前面正则表达式匹配的片段(贪婪匹配);匹配至少n次,至多m次;代表出现n到m次,{0,1} 相当于问号

4.2.1 匹配0个或多个表达式 *

对它前面的正则式匹配0到任意次重复,例1:

文本:121122
正则:12*
运行结果:匹配'12''1',或者'122'
# 只重复2,尽量多的匹配字符串

例2:重复.0到任意次,.有代表任意字符,所有d.*c能匹配dc之间包含任意字符

文本:d123456cwel
正则:d.*c
运行结果:d123456c

4.2.2 匹配1个或多个表达式 +

对它前面的正则式匹配1到任意次重复。ab+会匹配'a'后面跟随1个以上到任意个'b',它不会匹配'a'

文本:ababbbbaabbcaacb
正则:ab+
运行结果:匹配'ab''abbbb',或者'abb'

4.2.3 非贪婪匹配 ?

对它前面的正则式匹配0到1次重复。ab?会匹配'a'或者'ab

文本:ababbbbaabbcaacb
正则:ab?
运行结果:匹配'ab''ab''a''ab''a',或者'a'

4.2.4 懒惰模式 *?, +?, ??

'*','+',和'?'的懒惰模式,'*','+','?'修饰符都是贪婪的,它们在字符串进行尽可能多的匹配。有时候并不需要这种行为。在修饰符之后添加'?'将使样式以非贪婪方式或者dfn最小方式进行匹配,尽量少的字符将会被匹配

文本:ababbbbaabbcaacb
正则:ab*?
运行结果:匹配'a''a''a''a''a',或者'a'


<p data-line="558" class="sync-line" style="margin:0;">



4.2.5 对其之前的正则式指定匹配m个重复 {m}

对其之前的正则式指定匹配m个重复,少于m的话就会导致匹配失败。比如,a{6}将匹配6个'a',但是不能是5个

文本:ababbbbaabbcaacb
正则:ab{2}
运行结果:匹配'abb',或者'abb'


<p data-line="568" class="sync-line" style="margin:0;">



4.2.6 对正则式进行m到n次匹配 {m,n}

对正则式进行m到n次匹配,在m和n之间取尽量多,比如a{3,5}将匹配3到5个'a'。忽略m意为指定下界为0,忽略n指定上界为无限次。比如a{4,}b将匹配'aaaab'或者10000000个'a'尾随一个'b',但不能匹配'aaab'。逗号不能省略,否则无法辨别修饰符应该忽略哪个边界

文本:ababbbbaabbcaacb
正则:ab{2,}
运行结果:匹配'abbbb',或者'abb'


<p data-line="580" class="sync-line" style="margin:0;">



文本:ababbbbaabbcaacb
正则:a{2}b{2,4}
运行结果:匹配'aabb'


<p data-line="588" class="sync-line" style="margin:0;">



文本:ababbbbaabbcaacb
正则:ab{2,4}
运行结果:匹配'abbbb',或者'abb'


<p data-line="594" class="sync-line" style="margin:0;">



# 匹配前一个字符(或者子表达式至少m次)
<p class="mume-header " id="匹配前一个字符或者子表达式至少m次">





<p data-line="595" class="sync-line" style="margin:0;">



4.2.6.1 {m,n}?非贪婪模式

{m,n}?修饰符的非贪婪模式,只匹配尽量少的字符次数。比如对于'aaaaaa',a{3,5}匹配5个'a',而a{3,5}?只匹配3个'a'

文本:ababbbbaabbcaacb
正则:ab{2,4}?
运行结果:匹配'abb',或者'abb'
文本:aaaaaa
正则:a{3,5}
运行结果:匹配'aaaaa'
文本:ababbbbaabbcaacb
正则:a{3,5}?
运行结果:匹配'aaa',或者'aaa'

4.3 位置元字符

位置元字符:

  • ^

  • $

  • \A

  • \Z

  • \b

  • \B

4.3.1 ^

匹配字符串的开头是否包含正则表达式, 并且在MULTILINE模式也匹配换行后的首个符号

  • 例1:匹配字符串开头是否包含weY

文本:Hello Baidu
正则:^[weY]
运行结果:未匹配成功
  • 例2:匹配开头是否包含weH

文本:Hello Baidu
正则:^[weH]
运行结果:H
  • 例3:匹配开头是否包含2个以上的a

文本:bbaidu
正则:^b{2,}
运行结果:bb

4.3.2 $

匹配字符串尾或者在字符串尾的换行符的前一个字符,在MULTILINE模式下也会匹配换行符之前的文本。foo匹配 'foo' 和 'foobar',但正则表达式foo$只匹配 'foo'。在'foo1\nfoo2\n'中搜索foo.$,通常匹配'foo2',但在MULTILINE模式下可以匹配到'foo1';在'foo\n'中搜索$会找到两个(空的)匹配:一个在换行符之前,一个在字符串的末尾

  • 例1:

文本:baidu
正则:baidu
运行结果:baidu
  • 例2:

文本:baidudd
正则:baidu
运行结果:baidu

例3:

文本:baidu
正则:baidu$
运行结果:baidu

例4:

文本:bai du
正则:[iu]
运行结果:匹配'i',或者'u'

例5:

文本:bai du
正则:[iu]$
运行结果:u

4.3.3 \b

匹配空字符串,但只在单词开始或结尾的位置。一个单词被定义为一个单词字符的序列。注意,通常\b定义为\w和\W字符之间,或者\w和字符串开始/结尾的边界,意思就是'\bfoo\b'匹配'foo','foo.','(foo)','bar foo baz'但不匹配'foobar'或者'foo3'。

文本:baidu
正则:\bbaidu\b
运行结果:baidu
文本:aaa baidu bb
正则:baidu.
运行结果:baidu

默认情况下,Unicode字母和数字是在Unicode样式中使用的,但是可以用ASCII标记来更改。如果 LOCALE 标记被设置的话,词的边界是由当前语言区域设置决定的,\b表示退格字符

4.3.4 \B

匹配空字符串,但不能在词的开头或者结尾。意思就是'ba\B'匹配'baidu','bai','bai2',但不匹配'ba','ba.',或者'ba!' ``````.\B\b的取非,所以Unicode样式的词语是由Unicode字母,数字或下划线构成的,虽然可以用ASCII标志来改变。如果使用了LOCALE标志,则词的边界由当前语言区域设置

文本:baidu
正则:ba\B
运行结果:ba
文本:ba
正则:ba\B
运行结果:未匹配

4.4 特殊元字符

在正则表达式中,普通字符表示的还是原来的意思,比如表达式 1 可以匹配到数字 1,表达式 a 可以匹配到字母 a。

但是如果想要匹配到更多字符的时候,不可能把所有的字符都列一遍,这样就太浪费时间了,那有什么更好的办法呢?特殊元字符能帮到我们的忙

特殊元字符:

  • \d

  • \D

  • \s

  • \S

  • \w

  • \W

  • [\b]

  • .

4.4.1 \d

数字通配符,可以匹配到数字0-9

对于Unicode (str) 样式:匹配任何Unicode十进制数(就是在Unicode字符目录[Nd]里的字符)。这包括了[0-9],和很多其他的数字字符。如果设置了ASCII标志,就只匹配[0-9]

对于8位(bytes)样式:匹配任何十进制数,就是[0-9]

文本:aa1bb2ccc3dddd4e5ee
正则:\d
运行结果:匹配'1''2''3''4',或者'5'

4.4.2 \D

如果将D大写,则匹配到的是任意非数字,相当于 \d 的反义

匹配任何非十进制数字的字符。就是\d取非。如果设置了ASCII标志,就相当于[^0-9]

文本:aa1bb2ccc3dddd4e5ee
正则:\d
运行结果:
a
a
b
b
c
c
c
d
d
d
d
e
e
e

4.4.3 \s

空白符通配符,可以配到任意空白符,包括回车、换行、换页、制表符等

对于 Unicode (str) 样式:匹配任何Unicode空白字符(包括[ \t\n\r\f\v],还有很多其他字符,比如不同语言排版规则约定的不换行空格)。如果ASCII被设置,就只匹配[ \t\n\r\f\v]

对于8位(bytes)样式:匹配ASCII中的空白字符,就是[ \t\n\r\f\v]

文本:aa1bb2c cc3 dddd4e5ee
正则:\s
运行结果:匹配到两处

4.4.4 空白符

空白符分为下图中的几类,一般用 \s表示:

空白符:

  • \r:回车符

  • \n:换行符

  • \f:换页符

  • \t:制表符

  • \v:垂直制表符

4.4.5 \S

如果将S大写,则匹配到的是任意非空白符

匹配任何非空白字符。就是\s取非。如果设置了ASCII标志,就相当于[^ \t\n\r\f\v]

文本:aa1bb2c cc3 dddd4e5ee
正则:\S+
运行结果:匹配'aa1bb2c''cc3',或者'dddd4e5ee'

4.4.6 \w

字母数字下划线通配符,可以匹配到任意的字母数字下划线

对于Unicode (str) 样式:匹配Unicode词语的字符,包含了可以构成词语的绝大部分字符,也包括数字和下划线。

对于8位(bytes)样式:匹配ASCII字符中的数字和字母和下划线,就是[a-zA-Z0-9_]。如果设置了LOCALE标记,就匹配当前语言区域的数字和字母和下划线

文本:aa1Baidubb2c cc3 dddd4e5ee
正则:\w+
运行结果:匹配'aa1Baidubb2c''cc3',或者'dddd4e5ee'

4.4.7 \W

如果将W大写,则匹配到的是任意非字母数字下划线

匹配任何不是单词字符的字符。这与\w正相反。如果使用了ASCII旗标,这就等价于[^a-zA-Z0-9_]。如果使用了LOCALE旗标,则会匹配在当前区域设置中不是字母数字又不是下划线的字符

文本:aa1Baidubb无2ccc3dddd4e5ee
正则:\W+
运行结果:匹配'无'

4.4.8 [\b]

它只在字符集合内表示退格,比如[\b]

例1:匹配Baidu后面跟1个或更多数字

Baidu\d+

例2:匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)

^\B+

4.4.9 .

.点号通配符,可以匹配到除换行外的任意字符:

文本:Baidu_*&N<S.x/
正则:.
运行结果:
B
a
i
d
u
_
*
&
N
<
S
.
x
/


<p data-line="896" class="sync-line" style="margin:0;">



... ...

更多内容请前往原文地址

参考链接

https://deerchao.cn/tutorials/regex/regex.htm

https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expressions

https://docs.microsoft.com/zh-cn/dotnet/api/system.text.regularexpressions.regex?view=net-6.0

https://www.regular-expressions.info/

https://weblogs.asp.net/whaggard/377025

https://mp.weixin.qq.com/s/lX0-GjqYBUo4KncrpngcTw

https://mp.weixin.qq.com/s/tfzsPRiEjDGfO1BoPNu2RA

https://mp.weixin.qq.com/s/7rflGRsMioF3S2TX8TP_1Q

https://mp.weixin.qq.com/s/0sVMQDstgIZEpYZUvRNadg

https://mp.weixin.qq.com/s/JnmjFVg9IuLMgOKV8Z918g

https://mp.weixin.qq.com/s?__biz=MzI3NjY1OTA0NQ==&mid=2247484108&idx=1&sn=66ee027ffe1bbdf08ea0616f9d648277&chksm=eb736cc6dc04e5d0be33c3c9756b6dc37379f0e27f6982ec214fa85f70a42b303cf455f13766&scene=178&cur_album_id=2245264853273903105#rd


橙留香Park 橙留香来自一位三流剑客之乡,担任威胁猎手,脑子不会转弯,属于安全特学脑。橙留香同学[小菜鸟],定期分享从零入门车联网安全(包括基础知识储备)技术。只为你呈现有价值的信息,专注于车联网安全领域之Android终端反入侵技术研究。
评论
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 58浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 102浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 87浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 111浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 111浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 73浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 119浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 98浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 101浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 68浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 120浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦