关于正则表达式的学习

一:正则表达式:

正则表达式全称:regular experssion=RegExp
正则表达式的底层实现:
\d表示一个任意的数字0-9的数字如果是四个就表示4个连在一起的数字
matcher.find()完成的任务:
1.根据指定的规则,定位满足规则的子字符串比如(1998)
2.找到后,将子字符串的开始的索引记录到matcher对象的属性int【】groups;
groups[0]= 0,把该子字符串的结束的索引+1的值记录到groups[1]=4;
3.同时记录oldLast 的值为 子字符串的结束的索引+1的值即为4,即下次执行find时,就从4开始匹配

matcher.group(0)分析(不考虑分组):
1.根据groups[0]=0和group[1]=4的记录的位置,从content开始截取子字符串返回
就是[0,4)这个group【0】=和【1】记录的是字符串的索引
\d表示任意数字,\表示转移自带字符,前端页面获取过来需要转义一下
matcher.group(0)分析(考虑分组)
什么是分组,比如(\d\d)(\d\d),正则表达式中有()表示分组,第一个()表示第一组
第二个()表示第二组,以此类推

如果有()的话,会先group[0]=起始索引位置,group[1]=结束索引位置+1,再记录分组的数据
group[2]=起始索引位置,group[3]=括号内结束索引位置+1

matcher.group(0):表示匹配到的子字符串
matcher.group(1):表示匹配到的子字符串的第一组的字符串

二:元字符-转义号\

元字符从功能上大致分为:
\符号说明:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则
检索不到结果,甚至会报错的。用 去匹配 " a b c 去匹配"abc 去匹配"abc(" 会怎么样
java中的正则表达式中,两个\代表其他语言中的一个
需要用到转义符号的字符有以下:
.
*
+:
()
$
/

[]:
^:
{}:

元字符-字符匹配符
[]:可接收的字符列表 [efgh] efgh中的任意一个字符

[^]:不接收的字符列表 [^abc] 除a、b、c之外的任意一个字符,包括数字和特殊符号

-:连字符 A-Z 任意单个大写字母

. 匹配除\n以外的任何字符 a…b 以a开头,b结尾,中间包括两个任意字符的长度为4的字符串
匹配输出 aaab , aefb ,a34b ,a#*b

\d匹配单个数字字符,相当于[0-9] \d{3}(\d)?,包含3个或4个数字的字符串输出
123,9876,其中\d{3}相当于\d\d\d三个连在一起的数字

\D匹配单个非数字字符,相当于[^0-9] ,\D(\d)*:以单个非数字字符开头,后接任意个数字
字符串,输出a、A3243,A22

\w 匹配单个数字、大小写字符字符,相当于[0-9a-zA-Z] ,\d{3}\w{4},输出
234abcd、12345221、2212Pe

\W 匹配单个非数字、大小写字母字符下划线,相当于[^0-9a-zA-Z],\W+\d{2}
以至少一个非数字字母字符开头,2个数字字符结尾的字符串,
#23,#?@10

\s:匹配任何空白字符(空格,制表符)

\S:匹配非空白字符和\s相反

.匹配除了\n之外的所有字符,如果要匹配.本身则需要使用\.

java正则表达式默认是区分字母大小写的,如何实现不区分大小写
(?i)abc表示abc都不区分大小写
a(?i)bc表示bc不区分大小写
a((?i)b)c表示只有b不区分大小写
Pattern pat =Pattern.complie(str,Pattern.CASE_INSENSITIVE)//不区分大小写

三:正则表达式符号

1.限定符
:指定字符重复0次或n次 (abc) 仅包含任意个abc的字符串,等效于\w*
输出abc、abcabcabc

+:指定字符重复一次或n次(至少一次1到多) m+(abc)*
以至少一个m开头,后接任意个abc的字符串
m、mabc、mabcabc

?:指定字符重复0次或一次(最多一次)0到1 m+abc?
以至少一个m开头,后接ab或者abc的字符串
mab,mabc,mmabc,mmab

{n}:只能输入n个字符 [abcd]{3} 由abcd字母组成的人资长度为3的字符串,abc,dbc,adc

{n,}指定至少n个匹配 [abcd]{3,}由abcd中字母组成的任意长度不小于3的字符串,
aab、dbc、aabdd

{n,m}:指定至少n个但不多于m个匹配[abcd]{3,5} 由abcd中字母组成的任意长度不小于3,
不大于5的字符串
abc、abcd、aaaa、bdcab

2.选择匹配符
|:选择匹配符表示或
ab|bc ab,bc

3.分组组合和反向作用符

4.特殊字符

5.字符匹配符

6.定位符
:指定起始字符,[0-9]+[a-z]* 以至少一个数字开头,后接任意个小写字母的字符串
123、6aa、555edf

: 指定结束字 符 [ 0 − 9 ] − [ a − z ] + :指定结束字符 ^[0-9]\\-[a-z] + :指定结束字[09][az]+ ,以1个数字开头后接连字符"-",并以至少一个
小写字母结尾的字符串
1-a ,2-asc,2-fdsfds

\b:匹配目标字符串的边界,han\b,这里说的字符串的边界指的是子串间有空格
,或者是目标字符串的结束位置(这里的边界是指:被匹配的字符串最后
,也可以是空格的子字符串的后面)
匹配hanshunping sphan nnhanu
输出一个han

\B:匹配目标字符串的非边界,han\B 和\b的含义刚刚相反
匹配hanshunping sphan nnhan

四:捕获分组:

(pattern):非命名捕获。捕获匹配的子子字符串。编号为0的第一个捕获是由整个
正则表达式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号

(? pattern):命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。
用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号
替代尖括号,例如(?‘name’)
1.不命名分组
案例:(\d\d)(\d)(\d\d)
比如content=a2242b3124
group[0]:输出连在一起的4个数字:2242,3124
第一组的group[1]:两个数字22,31
第二组group[2]:一个数字4,2
第三组group[3]:2个数字42,24

2.命名分组(捕获分组):
(?\d\d)(?\d)(\d\d)
比如content=a2242b3124
group[0]:输出连在一起的4个数字:2242,3124
第一组的group[“g1”]:两个数字22,31
第二组group[“g2”]:一个数字4,2
第三组group[3]:2个数字42,24

五:非捕获分组(老程序员比较喜欢用)

cotent=陈光照老师|陈光照同学|陈光照弟弟
(?:pattern):匹配pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,
不存储供以后使用的匹配。这对于用or""字符(|)组合模式部件的情况很有用。
例如,industr(?:y|ies)是比industry|industries更经济的表达方式
cotent=陈光照老师陈光照同学陈光照弟弟
Pattern pattern =Pattern.complie(“陈光照(?:同学|弟弟|老师)”)
group[0]:输出陈光照老师,陈光照弟弟,陈光照同学

(?=pattern):它是一个非捕获匹配。例如,windows(?=95|98|NT|2000)匹配
windows 2000中的windows但不匹配windows 3.1中的windows

cotent=陈光照老师陈光照同学陈光照弟弟
Pattern pattern =Pattern.complie(“陈光照(?=同学|弟弟)”)
group[0]:输出陈光照弟弟,陈光照同学

(?!pattern):该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。
它是一个非捕获匹配。例如windows(?!95|98|NT|2000)匹配windows3.1中的windows但
不匹配windows2000中得到windows

cotent=陈光照老师陈光照同学陈光照弟弟
Pattern pattern =Pattern.complie(“陈光照(?!同学|弟弟)”)
group[0]:输出陈光照老师

非贪婪匹配

cotent=“h211111”
Pattern pattern =Pattern.complie(“\d+”)默认贪婪匹配
group[0]:输出11111

cotent=“h211111”
regex=“\d+?”
Pattern pattern =Pattern.complie(regex)非贪婪匹配
Matcher matcher=pattern.matcher(content);

matcher.group[0]:输出1,1,1,1,1

六:案例实战

1.汉字
String content =“陈光照”
regex=“^ [\u0391-\uffe5]”
Pattern pattern =Pattern.complie(regex)非贪婪匹配
Matcher matcher=pattern.matcher(content);

2.邮政编码
要求:是1-9开头的一个(6位数)比如:123891,134567
^ [1-9]//d{5}$
以1-9数字开头,最后5位数结尾
3.是一个1-9开头的5-10位数
^ [1-9]//d{4,9}$
以1-9数字开头,最后4-9位数结尾

4.手机号码
要求:必须以13,14,15,18开头的11位数
^1[3|4|5|8]{9}$

5.验证url的案例
ur如:https://www.bilibili.com/video/BV1W14y1b7Mq?spm_id_from=333.851.b_7265636f6d6d656e64.1
分析:以http://或者https://开头
“[]”里面的都不是限定符:如[.?*]里面的都不是限定符
?写在中括号里面就是问号不是限定符
^((http|https): //)([\w-]+.)+[\w-]+(/[\w-?=&/%.] *)?$

七:正则表达式三个常用类

java.util.regex包主要包括一下三个类pattern类、Matcher类和PatternSyntaxException

Pattern类
pattern对象是一个正则表达式对象。pattern类没有公共构造方法。要创建一个pattern对象,
调用其公共静态方法,它返回一个pattern对象,该方法接受一个正则表达式作为它的第一个参数,
比如 :Pattern r=Pattern.complie(pattern)

Matcher类
Mathcer对象是对输入字符串进行解释和匹配的引擎。与Pattern类一样,Matcher也没有
公共构造方法,你需要调用Pattern对象的matcher方法来获得一个Matcher对象

PatternSyntaxException
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误

八:分组、捕获、反向引用

1.分组:我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以
看作是一个子表达式/一个分组

2.捕获:
把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里
,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1.
第二个为2,以此类推。组0代表的是整个正则式

3.反向引用
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配
模式,这个我们被称为反向引用,这种引用既可以是在正则表达式内部,也可以是
在正则表达式外部,内部反向引用\分组号,外部反向引用$分组号。

反向引用案例
1.匹配两个连续相同的数字
(\d)\1
2.匹配5个连续相同的数字
(\d)\1{4}
3.匹配个位和千位相同的数字,百位和十位相同的数
5225,1551 (\d)(\d)\2\1 \2,\1代表引用分组几

$1,$2反向引用,就是获取匹配到的内容

规定电子邮件规则为
1.只能有一个@
2.@前面是用户名,可以是a-z A-Z 0-9 _字符
3.@后面是域名,并且域名只能是英文字母
content =“cgz@Sss.cs.dq.cn
regStr=”^ [\w-]+@([a-zA-Z]+\.)+[a-zA-Z]+$"

验证是不是整数或者小数
比如123 -234 34.89 -87.9 -0.91 0.02
regStr=“^ [-+]?([1-9]\d*|0)(\.\d+)?$”

对一个url进行解析
http://www.souhu.com:8080/abc/index.htm
1.要求得到的协议是什么? http
2.域名是什么?www.sohu.com
3.端口是什么? 8080
4.文件名是什么? index.htm
regStr=“^([a-zA-z]+) : //([a-zA-Z.]+): (\d+)[\w-]*/([//w.@# $ #]+)$”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值