Java中快速掌握正则表达式

概述

某个语句规则的字符串

匹配符号

  1. 中括号[ ]:只有方括号里面 指定的字符 才参与匹配,也只能匹配单个字符任意一次。也可以使用[ - ]的形式代表区间

    • 表达式: [c蔡i]xk 只可以匹配:cxk,蔡xk,ixk 。不可以匹配:菜xk,Cxk 等。
    • 表达式:[0 - 9] 代表匹配0到9的所有数字。 [a - z]代表匹配小写a到z的所有字母。[0 - 9a - zA - Z]代表匹配所有的数字,小写字母,大写字母。
    • 表达式:例如:如果要匹配一个数0到9后边还有-,如何匹配?表达式:[0 - 9 \ - ],就OK啦
    • 如果我不想匹配0到9的所有数字怎么办? 此时需要 ^ 来标记,表达式:[ ^ 0 - 9 ]
    • 如何编写代码匹配后面不包含 的数据? 表达式:爱 [ ^ 你 ]
    • public boolean matches(String regex)告诉这个字符串是否匹配给定的正则表达式
  2. 英文句点 . 符号: 匹配 单个任意字符它只能出现在方括号外

    • 表达式t.o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等
    • 匹配任意字母之后是ar的字符串,例如:ear,car,parked,barked,表达式:. ar
  3. 可选字符(匹配次数的符号)

符号字符出现次数例子
?0次或者1表达式:比如honu?r,指u可以出现也可以不出现,honr或honur
{n}恰好n比如匹配下列电话号码如186482656,如何匹配?表达式:\d{9} --------- 比如匹配下列电话号码如010-676448的形式,如何匹配?表达式:\d{3}-\d {6}
{n,m}n次或者m比如表达式:\d{8,9},指可以匹配12435453或者124354535 -------当只想遇到8个数字时候,不在匹配9个数字的时候怎么办呢?表达式\d{8,9}\?注意这里的? 表示的是非贪婪模式,尽可能很少的匹配字符-------综合题:以3或者4数字开头,后面7个数字,例如:020-7281333,如何表示?表达式:\d{3,4} - \d{7}
{n,} n 次或者n次以上表达式:\d{0,} 表示0个或者无数个;表达式:\d {1,} 表示1个或者无数个
*0次或者相当于{0,}
+1次或者相当于{1,},例如匹配以f开头的数据,如food,faker,f04523…a123,表达式:f.+
  • 匹配所有的手机号码,1. 必须是11位的数字,2. 第一位数字必须以1开头,第二位数字可以使[3,4,5,6,7,8],后面9个数是[0 - 9]中的任意一个数字,表达式:^1[345678] \d {9}

  • 匹配网站地址,1. http s : //code.com/ 或者http: //code.com/的形式,2. 不能有httphttp:jn/code形式,表达式:http . */$

快捷符号

  • \d :匹配任意数字,相当于[0 - 9],相反\D:匹配的是非数字[ ^ 0 - 9]

  • \w :匹配字母,数字,下划线,相当于表达式[0 - 9 a - z _ A - Z],相反\W:匹配的是非字母,数字,下划线[ ^ 0 - 9 a - z _ A - Z]

  • \s :匹配空白符,比如空格,tab,换行等,例如"鸡你太美 ",匹配后边空格或者tab怎么弄? 表达式:“鸡你太美\s相反\S:匹配的是非空格,tab,相当于全部

  • \b:匹配有边界单词,例如字符串"absmasterjhjs-master-dsgsdg"master",则表达式:\bmaster\b,匹配出的是后面两个master,,,例如匹配1,2,3a456的匹配边界数字的话,表达式:\b \ d \b,只能是12,3a456

开始和结束

  • ^ :指的是一个字符串的开始,例如^Java,匹配的是Java-sfasafgJava

  • $ :指的是一个字符的结束,例如Java$,匹配的是java-dsgfjavagsd-java

注意:当都加上 ^Java$,匹配的是Java。这里 前后 没有任何东西就光是Java

分组及其各种形式

  1. 在正则表达式,除了获取整个匹配,还能够在匹配中选择每一个分组,使用 () 即可。

    • 例如:鸡你太美:777-233333,如何表示呢? 表达式:( \d { 3 } ) - ( \d { 6 } )
    • 提取标签中的数据:例如:< div >cxk< /div >要匹配,但是提取cxk怎么提取呢?表达式:< div > ( . * ? ) < /div >
    • 提取年月日:例如:需要匹配2020-1-2,2020-2-2,2020-01-02,2020/01/02,20200318,2020 04 15需要提取2020 1 2,2020 2 2,2020 01 02,2020 01 20,2020 01 01,2020 02 02如何提取呢?( \d{ 4 } ) [ -/\ \s ] ? ( \d{ 1,2 } ) [ -/\ \s ] ? ( \d{ 1,2 } )
  2. 或者条件 ( | )

    • 例如:1.avi,abc.mp4,chapter.wmv,image.jpg,提取所有视频图片文件后缀名,如何提取? 表达式:( .mp4 | .avi | .wmv | .jpg )
  3. 非捕获分组 ( ?:表达式 )
    需要匹配:01-75855,0731-75855,12345-75855,tel:75855,需要提取的是75855,如何提取?表达式 :( ? : \d { 2 } | \d { 3 } | \d { 4 } | \d { 5 } | tel ) [ \ - : ] ( \d { 5 } )

  4. 分组的回溯引用 (\n)使()分组重复一次,排列顺序从1开始

    • 例如:匹配123< font >提示 < /font > abcd的标签< font >和内部内容怎么实现呢?表达式:<( \w+ )> .*? </ \ 1> 注意.*?是指任意所有字符类型,\1指的就是(\w+)
    • 例如:匹配符合的ab ba这种关系的单词,如何实现呢?表达式:(\w) (\w) \2 \1
  5. 正向行断言 (?=表达式)指在某个位置向右看,表示所在位置右侧必须能匹配表达式

    • 例如:我喜欢你,我喜欢,我喜欢我,喜欢,喜欢你,如果说要取出喜欢两个字,要求喜欢后面有 ,如何实现?表达式:喜欢(?=你) ,我喜欢你和喜欢你符合条件
    • 提取包含大小写字母的字符串,表达式:()(?= .*?[a-z]) (?= .*?)[A-Z] .+
    • 密码强度验证,条件:1至少一个大写或者小写字母,2至少一个数字,至少8个字符;表达式:(?= .*?[a-z]) (?= .*?[A-Z]) (?= .*?[0-9]) .{8}
  6. 反向行断言 (?!表达式) 指保证从左往右不能出现某字符

    • 例如: 我喜欢你,我喜欢,我喜欢我,喜欢,喜欢你,如果说要取出喜欢两个字,要求喜欢后面 ,如何实现?表达式喜欢(?!你),我喜欢,我喜欢我,喜欢符合条件
    • 排除邮箱 @(?!qq)
  7. 正向行断言 (?<=表达式) 指从某个位置向左看,所在位置左侧必须能匹配表达式

    • 例如:如果想取出喜欢两个字,要求喜欢的前面有我,后边有你,怎么实现呢? 表达式:(?<=我)喜欢(?=你)
    • 例如:匹配王姓同学的名字,需要匹配的王芳,王芳芳,芳芳 王菲,表达式:(?<=王) \S+ 注意:\S+的意思是除了空白,tab,换行以外的字符
  8. 反向行断言 (?<!表达式) 指从某个位置向左看,所在位置左侧不能匹配表达式

    • 例如:如果想取出喜欢两个字,要求喜欢的前面有我,后边有你,怎么实现呢? 表达式:(?<!我)喜欢(?!你)
    • 匹配一个美元符号中的数据注意:匹配$符号要加上转义字符\哦,表达式:(?<!\$) \ $ [^ \$]+\ $ (?!\$)

常用的正则表达式

https://lemon-.blog.csdn.net/article/details/91417485?spm=1001.2014.3001.5506

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发热的嘤嘤怪(2003计科胜胜同学)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值