正则表达式
1 、简介
正则表达式用于处理字符串,它通过约束字符的排列规则,可以:
- 验证字符串是否匹配正则规则;
- 检索符合规则的字符串;
完整的正则表达式包括:
- 特殊字符(或“元字符”)
- 文字(或“普通文本字符”)
2、元字符
2.1、
字符 | 关键词 | 解释 |
---|---|---|
\d | 数字字符 | 匹配一个数字字符,等价于[0,9] |
\D | 匹配一个非数字字符 | |
\n | 换行符 | 匹配一个换行符 |
\r | 回车符 | 匹配一个回车符 |
\s | 空白字符 | 匹配任何空格字符,包括空格、制表符、换页符等,等价于[\f\n\r\t\v] |
\S | 匹配任何非空白字符 | |
\w | 单词字符 | 匹配一个单词字符(包括下划线字符),等价于[A-Za-z0-9] |
\W | 匹配任何非单词字符 |
2.2、
. | 匹配任意一个字符 |
---|---|
\ | (反斜杠)转义字符,将特殊字符转义成普通字符 |
2.3、
() | 标记一个子表达式,一个子表达式可以匹配一段字符串 |
---|---|
| | 意为’或’,|两边的子表达式称为多选分支 |
形如(子表达式a|子表达式b)这样的结构称为“多选结构”,|两边的子表达式称为“多选分支”。
2.4、限制符
? | 匹配前面的子表达式或字符0或1次 | 至多1次 |
---|---|---|
***** | 匹配至少0次 | [0,n] |
+ | 匹配至少1次 | [1,n] |
{min,max} | 匹配至少min次,至多max次 | [min-max] |
{n} | 匹配n次 | |
{n,} | 至少匹配n次 |
注意:***** 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个**?**就可以实现非贪婪或最小匹配。
贪婪匹配:贪婪模式会尽可能多的匹配
**非贪婪匹配:**非贪婪模式会尽可能少的匹配
当**?*紧跟在任何一个其他限制符、+、?、{n}、{n,}、{n,m}后面时,匹配模式都是非贪婪的。
2.5、
^ | 匹配文本的开始位置,^称为脱字符 |
---|---|
$ | 匹配文本的结束位置 |
3、字符组
字符组用**[]表示,一个字符组匹配一个字符的位置**,且该位置可以匹配字符组中的任一个字符。
3.1 连字符
字符组元字符 -(连字符),表示一个范围,注意如果用在字符组开头,如[-]或[^-],则只代表是一个 - 字符,不表示范围
3.2 排除字符
排除型字符组:[^…] 匹配 除字符组内所有字符 之外的 任何字符
注意:在字符组内部,元字符的定义规则(及他们的意义)是不一样的。例如,在字符组外部,点号是元字符,但是在内部则不是如此。相反,连字符只有在字符组内部才是元字符,否则就不是。
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
//1 正则校验
//写一个正则表达式,匹配手机号
String str = "31415";
String regx = "\\d\\d+";
boolean tar = Pattern.matches(regx, str);
System.out.println(tar);
//2 正则检索
String ip = "192.168.1.141";
//
String r2 = "\\d{2,}?";
//编译指定的正则表达式
Pattern p2 = Pattern.compile(r2);
//将传入的字符串匹配指定的正则表达式
Matcher m = p2.matcher(ip);
while(m.find()) {//向下查找一次,是否存在匹配的字符串,返回布尔值
System.out.println(m.group());//打印匹配到的字符串
}
Java内存模型
1、 Java内存模型JMM (Java Memory Model)
Java虚拟机(JVM)在执行Java程序的过程中,会把它管理的内存划分为几个不同的数据区域(也就是运行时的数据区域),这些区域都有各自的用途、创建时间、销毁时间。
2、 Java虚拟机运行时数据区(JVM Runtime Data Area)
在Java虚拟机规范(JVMS)中定义了多种程序运行时会用到的存储不同类型数据的内存区域,统称为“Java虚拟机运行时数据区”,有的数据区是全局共享的(static),有的是线程私有的(局部变量)。
全局共享:随着JVM启动而创建,随着JVM退出而销毁
线程私有:随着线程开始而创建,随着线程结束而销毁
2.1 运行时数据区划分
-
程序计数器 (program counter register)
-
Java虚拟机栈 (VM stack)
-
本地方法栈 (native method stack)
-
堆 (heap)
-
方法区 (method area)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWHRaNHt-1666355927467)(file:///C:\Users\19912\AppData\Local\Temp\ksohtml20800\wps1.jpg)]
jdk1.8之前的JMM模型图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayjlcN4z-1666355927468)(file:///C:\Users\19912\AppData\Local\Temp\ksohtml20800\wps2.png)]
JDK1.8以后的JMM模型图
2.2 程序计数器(Program Counter Register)
-
一块较小的内存空间,他的作用可以看做是:当前线程所执行的字节码的行号指示器
-
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法(JDK自带的方法),这个计数器值为空。
-
此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError(内存溢出)情况的区域
2.3 虚拟机栈(VM Stack)
-
线程私有
-
后进先出(LIFO)栈 last in first out
-
存储栈帧,支撑Java方法的调用,执行和退出
-
可能出现OutOfMemeoryError异常和StackOverFlowError异常
OutOfMemeoryError(内存溢出):当jvm栈被设计成可动态扩展,在动态扩展时无法申请到足够的内存
StackOverFlowError(栈溢出):线程请求的栈深度大于jvm允许的最大深度
2.4 本地方法栈(Native Method Stack)
在HotSpot中本地方法栈与VM Stack合并
本地方法栈与Java虚拟机栈基本相同,区别在于:
-
Java虚拟机栈为JVM执行字节码所服务
-
本地方法栈为JVM执行Native方法所服务,支撑Native方法的调用,执行和退出
2.5 方法区: static final
方法区存放了要加载的类的信息Class(名称、修饰符等)、类中的静态常量、类中定义为final类型的常量、类中的Field信息、类中的方法信息Method,当在程序中通过Class类的方法来获取对象信息时,这些数据都来源于方法区。方法区是被Java线程所共享的,不像Java堆中其他部分一样会频繁被GC回收,它存储的信息相对比较稳定,在一定条件下会被GC,当方法区要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。方法区也是堆中的一部分,就是我们通常所说的Java堆中的永久区 Permanet Generation,大小可以通过参数来设置,可以通过-XX:PermSize指定初始值方法区包含所有的class和static变量、final变量,-XX:MaxPermSize指定最大值。
· 又叫静态区,跟堆一样,被所有的线程共享。
· 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。(两者区别为堆区存放new出来的对象信息,方法区存放类信息)
2.6 堆heap
堆是JVM所管理的内存中最大的一块,是被所有Java线程共享的,不是线程安全的,在JVM启动时创建。堆是存储Java对象的地方,这一点Java虚拟机规范中描述是:所有的对象实例以及数组(即所有的引用类型)都要在堆上分配。Java堆是GC管理的主要区域,从内存回收的角度来看,由于现在GC基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代;新生代再细致一点有Eden空间、From Survivor空间、To Survivor空间等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0H6pmTxE-1666355927468)(file:///C:\Users\19912\AppData\Local\Temp\ksohtml20800\wps3.jpg)]私有内存区——伴随线程的产生而产生,一旦线程终止,私有内存区也会自动消除