首页 > 其他分享 >小菜鸡的学习笔记---<正则表达式(1)>

小菜鸡的学习笔记---<正则表达式(1)>

时间:2022-10-26 18:01:38浏览次数:57  
标签:字符 匹配 前面 正则表达式 笔记 --- 小菜 字符串 表达式

正则表达式学习笔记(1)

(纯新手学习笔记,大佬绕路 QAQ)

一.简介

正则表达式就是一种文本模式用来匹配一系列满足特定条件的字符串,可以对比一下数学里面的表达式,比如我们要用一个表达式表示一串数字1,4,7,10,13,16......,数学表达式就是3x+1,同样的如果我们要表示一串邮箱也可以用一个正则表达式来表示^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$,这个表达式就能表示如[email protected],[email protected]等等格式的字符串。正则表达式有很多作用,比如说刚刚提到的邮箱格式,这个可以用来规范用户的输入,有时候只能让用户输入纯数字或者指定格式的数据,那么就可以用正则表达式来和用户的输入进行比较,只有满足这个表达式才能成功提交;然后就是可以快速匹配文档中所有特定信息,如果要替换文档中所有的像usc-1234,usc-zyui,usc-12in......这种数据就可以用一个正则表达式把文档中所有对应字符串进行修改,而不用一个一个去修改(因为只有前面的几个字母是相同的);同样也可以快速在海量的数据中提取所需的满足特定要求的所有数据。

二.正则表达式语法及实例

[字母数字等]  匹配中括号里面包含的所有字符,比如[abcxyz]就匹配这六个字母,一个字符串中appleyes这个字符串中满足前面那个正则表达式的字符就是ay

[^数据] 加上^这个符号就是取反的意思,相当于不匹配[数据]所表示的那些字符,比如[^abcxyz]就是匹配除这六个字母以外的字符,appleyes满足的字符就是pplees

[1-9a-z]连字符就是表示一整个区间的所有数据,比如这个正则表达式就是匹配1,2,3,4...,9和a,b,c,...,z的所有字符,GoodJob123满足的就是oodob123

\w  匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

\n 匹配匹配一个换行符,\f 匹配一个换页符,\r 匹配一个回车符,\t 匹配一个制表符,\v匹配一个垂直制表符,\s匹配所有空白符,如\n,\t,\r等等,\S匹配所有非空白符就是除了\t,\r这些以外的所有字符,包括数字字母符号等.

$ 匹配字符串结尾,可能有时候要求用户输入必须以com结尾就可以在最后加上com$
()小括号包围的算一个整体,也就是一个子表达式方便调用

* 匹配前面的子表达式零次或多次。

+ 匹配前面的子表达式一次或多次。

. 一个点号就表示除了\n和\r外的所有字符。

[] 标记一个中括号表达式,比如前面的[a-z],[1-9]等等需要用到中括号。

? 匹配前面的子表达式零次或一次。

\ 对相应字符进行转义,将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。

^ 前面提到在方括号中用表示取反,在外面使用^这个符号表示匹配字符串开头,和$符号相对应。

{ } 表示前面的字符或者子表达式可以出现多少次,比如说a{2}表示必须匹配2个a,a{2,}表示可以匹配2个以上的a,(ab){1,3}表示可以出现1-3个连续的ab。

| 两项之间的选择其中一个。

 

三.特殊字符分析

1.贪婪与非贪婪匹配

刚刚介绍的有几个字符会有一些共同点,比如*和+,这两个符号分别是匹配零次或更多的字符以及一次或更多的字符,都是尽可能地匹配所有符合要求的字符,但是有时候我们不需要匹配所有满足要求的字符,这时我们可以结合?实现最小匹配,也称为非贪婪匹配。举个例子有一个字符串为<b>123>aa>123>a<c>,我们用这样一个正则表达式去匹配,<.*>,<匹配第一个,.号会尽可能的去匹配所有字符,直到最后一个>符号,如果在<c>后面还有一个>符号那么.*就会去匹配<c>和最后一个>之间的满足要求的字符,也就是在满足正则表达式要求的情况下尽可能多的去匹配所有字符。但如果我们想要尽可能短的获得符合要求的字符,比如我们只需要<b>这么一个标签,那么就是让符合要求的字符数量尽可能少,我们就在*号或者+后面加上一个?号,这个?仅表示非贪婪尽可能短的匹配,比如<.*?>来匹配前面的字符串得到的匹配结果就是<b>以及<c>,可以根据需要取舍最后的结果。

2.定位符

前面提到$ 匹配字符串结尾,^这个符号表示匹配字符串开头,同样还有\b匹配一个单词边界,即字与空格间的位置,\B表示非单词边界匹配,我们要求用户必须以大写字母开头并且数字结尾就可以使用下面这个表达式^[A-Z].*[0-9]$。对于\b,举个例子这样一个字符串Hello World,正则为\bHe我们就匹配到He,如果正则为\bell那么就匹配不到任何字符,以为ell在单词的中间部分,并不是单词的边界,并且\b的位置也很重要,如果在前面就是从边界向后匹配,如果在后面就是从边界也就是空格处向后匹配,比如llo\b就能匹配,而\bllo就不行,因为llo的左侧才是空格边界。\B自然而然就和前面的\b相对应,\b匹配边上的字符,\B就是匹配单词中间的字符,比如\Bell。并且\B的位置既可以在前面也可以在后面。

3.圆括号()

进行分组,把里面的内容当作整体处理,进行选择,可以把需要进行选择的数据放在圆括号里面并用|隔开,此外圆括号里面的内容作为子表达式还会被存储下来,可以通过相应的方法调用,不但可以得到最后的值也可以分别得到各个子表达式的值,如果我们不需要子表达式的值只要最终结果那么可以在圆括号里面加上?:比如(?:[A-Z]|[1-9])。

 4.?=、?<=、?!、?<! 的使用

abc(?=123)  先匹配到123,然后再去匹配和123前面连接的abc,比如这样一个字符串aabc12354j,最后匹配得到的结果就是abc,并且abc和123必须是紧接着的。(?<=123)abc和前面那个相反,这个是匹配123后面紧接着的abc,abc(?!123),可以注意到这个!号,表示否的意思,也就是匹配字符串中的abc,并且匹配到的abc后面跟着的不能是123。(?<123)abc,这个匹配abc并且前面接着的不是123。

5.反向引用

前面提到小括号会把他的子表达式的值给存储下来,既然是存储那么我们自然也能进行访问,可以通过\n的方式进行访问,n表示第几个,这个功能可以查找文本中两个相同的相邻单词的匹配项,就是利用子表达式的值会被存储这个效果把下一个匹配的单词和前一个相比较,看是否相同。

 

标签:字符,匹配,前面,正则表达式,笔记,---,小菜,字符串,表达式
From: https://www.cnblogs.com/yeipunz/p/regex.html

相关文章