首页 > 编程语言 >java学习记录06

java学习记录06

时间:2024-11-14 18:44:27浏览次数:3  
标签:字符 java 匹配 正则表达式 可以 记录 规则 06

正则表达式匹配规则

对于正则表达式来说,它只能精确匹配字符串。

例如:正则表达式“abc",只能匹配”abc",不能匹配“ab","Abc","abcd"等其他字符串。

如果想匹配非ASCII字符,例如中文,那么就用\u####的十六进制表示,例如: a\u548cc匹配的是字符串"a和c",中文字符和的Unicode编码是548c。

基本规则

匹配任意字符

我们可以用 . 匹配一个任意字符。

例如,正则表达式a.c中间的点可以匹配任意一个字符,它可以匹配abc,a&c,acc等,但是不能匹配ac、a&&c,因为 . 匹配一个字符且仅限一个字符。

匹配数字

如果我们只想匹配0~9这样的数字,可以用\d匹配。

例如:00\d可以匹配 007, 008,但不能匹配00A,0077,因为\d仅限单个数字字符。 

匹配常用字符

用\w可以匹配一个字母、数字或下划线,w的意思是word。

例如:java\w可以匹配,javac,java9,java_,它不能匹配java#,java ,因为\w不能匹配#、空格等字符。

匹配空格字符

用\s可以匹配一个空格字符,空格字符不但包括空格,还包括tab字符(在Java中用\t表示)。

例如:a\sc,可以匹配a c, 它不能匹配ac,abc等。

匹配非数字

用\d可以匹配一个数字,而\D则匹配一个非数字。

例如,00\D可以匹配,00A,00#,但不能匹配007,008等。

类似的,\W可以匹配\w不能匹配的字符,\S可以匹配\s不能匹配的字符,这正好是相反的。

重复匹配

修饰符*可以匹配任意个字符,包括0个字符。

修饰符+可以匹配至少一个字符。

修饰符?可以匹配0个或一个字符。

如果想精确指定n个字符,用{n}就可以。

如果想指定n~m个字符,用{n,m}就可以。

单个字符的匹配规则如下:

正则表达式规则可以匹配
A指定字符A
\u548c指定Unicode字符
.任意字符ab&0
\d数字0~90~9
\w大小写字母,数字和下划线a~zA~Z0~9_
\s空格、Tab键空格,Tab
\D非数字aA&_,……
\W非\w&@,……
\S非\saA&_,……

 多个字符的匹配规则如下:

正则表达式规则可以匹配
A*任意个数字符空,AAAAAA,……
A+至少1个字符AAAAAA,……
A?0个或1个字符空,A
A{3}指定个数字符AAA
A{2,3}指定范围个数字符AAAAA
A{2,}至少n个字符AAAAAAAAA,……
A{0,3}最多n个字符空,AAAAAA

 复杂规则

匹配开头和结尾

用正则表达式进行多行匹配时,用^表示开头,$表示结尾。

匹配指定范围

使用[...]可以匹配指定范围内的字符,例如[123456789]可以匹配1~9。

如果规定一个7~8位数字的电话号码不能以0开头,规则:[123456789]\d{6,7}。

觉得把所有字符列出来太麻烦,[...]还有一种写法,直接写[1-9]就可以。

如果要匹配不限大小写的十六进制数,例如1A2b3c,可以这样写[0-9a-fA-F]。

如果要匹配6位十六进制数,前面讲过的{n}仍然可以继续配合使用:[0-9a-fA-F]{6}。

[...]还有一种排除法,能够不包含指定范围的字符。[^1-9],表示不匹配1~9之间的字符。

或规则匹配

用 | 连接的两个正则规则是或规则,例如,AB|CD表示可以匹配AB或CD。

使用括号

如果想要匹配字符串learn java、learn Vue 和 learn C#,一个规则是learn\sjava|learn\sVue|learn\sC#,但这样太麻烦了,可以把公共部分提出来,然后用(...)把其表示成learn\s(java|Vue|C#)。

复杂匹配规则主要有:

正则表达式规则可以匹配
^开头字符串开头
$结尾字符串结束
[ABC][…]内任意字符A,B,C
[A-F0-9xy]指定范围的字符A,……,F0,……,9xy
[^A-F]指定范围外的任意字符A~F
AB|CD|EFAB或CD或EFABCDEF

分组匹配

(...)还有一个重要作用就是分组匹配。

我们来看一下如何用正则匹配区号-电话号这个规则,利用匹配规则,可以写出:

提示:中间-前的\也是转义字符
\d{3,4}\-\d{6,8}

但如何分别提取出区号和电话号呢,我们可以先把上述正则表达式变为

(\d{3,4})\-(\d{6,8})

之后要按括号提取字符串,必须要用到java.util.regex包,用Pattern对象匹配,匹配后获得一个Matcher对象,如果匹配成功,就可以直接从Matcher.group(index)返回字符串:

要特别注意,Matcher.group(index)方法的参数用1表示第一个子串,2表示第二个子串。如果我们传入0会得到什么呢?答案是010-12345678,即整个正则匹配到的字符串。

使用Matcher时,必须首先调用matches()判断是否匹配成功,匹配成功后,才能调用group()提取子串。

非贪婪匹配

正则表达式默认使用贪婪匹配:任何一个规则,它总是尽可能多地向后匹配。

例如:我们给定一个字符串表示的数字,判断该数字末尾0的个数。

123000, 该正则表达式为:(\d+)(0*)

发现并没有如我们期望的那样分组。

实际上它是完全合理的,因为\d+确实可以匹配后面任意个0。

这是因为正则表达式默认使用贪婪匹配:任何一个规则,它总是尽可能多地向后匹配,因此,\d+总是会把后面的0包含进来。

要让\d+尽量少匹配,让0*尽量多匹配,我们就必须让\d+使用非贪婪匹配。在规则\d+后面加个?即可表示非贪婪匹配。

因此,给定一个匹配规则,加上?后就变成了非贪婪匹配。

注意:?的含义并不相同,\d?表示匹配0个或1个数字,\d??后面的?表示非贪婪匹配。

标签:字符,java,匹配,正则表达式,可以,记录,规则,06
From: https://blog.csdn.net/cwtlw/article/details/143747544

相关文章

  • java学习记录05
    Object类通用方法Object类是所有类的超类。如果在类声明中没有使用extends关键字明确指定超类,那么默认的超类就是Object类。这就意味着所有的对象(包括数组)都实现了该类的方法。Object的所有方法native表示这个方法的实现是由其他语言(例如C或C++)编写的,它并不在Java源代码中......
  • Vue学习记录03
    响应式基础声明响应式状态ref()在组合式API中,推荐使用ref()函数来声明响应式状态:import{ref}from'vue'constcount=ref(0)ref()接收参数,并将其包裹在一个带有.value属性的ref对象中返回:constcount=ref(0)console.log(count)//{value:0}console.log(......
  • 深入理解 Kubernetes 中的 Service、Ingress 和 NginxIngress:如何配置多个域名访问 Ja
    个人名片......
  • Java方法(四)
    设计方法原则:本意为功能块,是实现某个功能语句块的结合,设计方法时保持原子性(一个方法完成一个功能)publicclassoperator{publicstaticvoidmain(String[]args){intsum=add(1,3);System.out.println(sum);}//加法publicstaticint......
  • java类加载中的双亲委派机制
    ​ 双亲委派机制的优点: 同样的类不会被重复加载。 一、概述:类加载器:类加载器用于加载 .class字节码文件到内存中(并为每个.class字节码文件生成 Class对象)。 二、四种类加载器介绍:​编辑  2.1.启动类加载器(BootstrapClassLoader): 用于加载jdk的核......
  • cxGrid【过滤、排序】后获取选中记录的值和cxGrid空表判断
    方法一:使用函数GetRowValue此方法在表格过滤、排序后也正常,请注意:此代码顺序需要CXGRID的列顺序和ADOQUERY中SELECT的字段顺序一致,否则会取错。procedureTfrmBillExtraction.pmGetBill_D_DatasClick(Sender:TObject);varI,J:Integer;beginwithcxGDBTV_Bill_M.Data......
  • 代码随想录算法训练营第三十天| 452. 用最少数量的箭引爆气球 、435. 无重叠区间 、76
    452.用最少数量的箭引爆气球思路:以前做过最大不相交子序列的题,这次也是往这根据某一端排序的思路想的,排序后如下图,只需要维护一个公共序列的右边界r就可以了,下一次判断时,只需要判断子区间的左边是否小于r。这个题有点坑的是使用Arrays排序,如果使用昨天的方法:Arra......
  • stringRedisTemplate 异步操作的问题记录
    一、问题背景StringRedisTemplate使用stringRedisTemplate.opsForValue().set时,会出现set之后立马get获取值,发现获取不到set进去的值。二、问题原因1、在使用redisson的情况下,stringRedisTemplate.opsForValue().set操作会是异步操作,造成。你在set之后,立马get获取值的时候会......
  • 基于SSM房屋租赁出售网站JAVA【毕设源码论文】
      博主介绍:......
  • (多端小程序网页)茗茶叶销售平台JAVA和vue【毕设源码论文】
      博主介绍:......