文章目录
前言
博客仅记录个人学习进度和一些查缺补漏。
学习内容:BV17F411T7Ao
一、正则表达式
以某种方式检验表达式是否符合要求,常用于检验注册用户名及密码是否合法。简而言之,就是一种规则。
细节:[ ]包括的规则是指从左到右依次一个一个字符进行判断。每个中括号只对应一个字符。
细节:对于一个字符的并集可以使用中括号包含中括号
注意&符号的个数,单个就是符号,两个就是且(交集)
预定义的范围。但是由于这些符号要写到字符串里面,所以需要使用转义字符。
\实际上是转义了两次。
但是以上都是只出现一次字符。如果需要多次指定类型需要使用如下规则:
其中X就是类似\d 或者\S 的符号。
练习:
代码如下:
String CphoneNumber = "1[3-9]\\d{9}";
String SphoneNumber = "[0-1]\\d{2,3}-?[1-9]\\d{4,9}";
String MailAdress = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}";
(?i)指忽略后续字母的大小写,同样遵守括号规则(分组规则),如xxxx((?i)xxxxx)xxx,只忽略中间几个字母的大小写。
看得懂会改就行,一般不会自己写。
爬虫
在一段文本中爬取指定的数据
// Pattern:表示正则表达式类
// Matcher:文本匹配器,用指定的pattern来爬取匹配的文本,从头开始读(大字符串中获取子字符串)
读取网络数据,需要先创建网络连接对象,然后使用连接对象获取网页上的数据流,再将数据流转换成字符串。最后丢给写好pattern的matcher来进行匹配。
?表示占位符,指前面的字符整体。
(?=8|11|17)表示后面只做判断,不纳入正则获取。
(8|11|17) 表示后面不仅要做判断,也要加上去(纳入获取)
(?:8|11|17)和上面一个意思。
(?!8|11|17)表示只要前面,后面只做判断并且不纳入获取。
贪婪爬取与非贪婪爬取
例如正则“ab”
对字符串“abbbbbbbbbbba”
贪婪爬取:尽可能多获取数据,使用“ab+”,获取“abbbbbbbbbbb”
非贪婪:尽可能少获取数据,使用“ab+?”,获取“ab”
分组就是小括号,在括号内是组内小正则,组间是前后正则链接的关系
从左到右数左括号,每一个左括号就是一个索引,表示第几个组。
使用\组号表示把第X组的数据再拿出来用一次。
这个方法在一些算法题找字串非常有用,我记得那时一个excel的单元问题。
单字符的开头和结尾:
普通子串的开头和结尾:
重复子串(不知道重复次数)的开始和结尾:
当出现前后两个字符串都需要使用到分组内容的时候,就需要使用$符号。
注意:非捕获分组不会占用组号,特点是里面有?,问号表示括号外前面的所有内容,并且提示这是一个非捕获分组。
二、时间
java中的时间类会有独特的运算方法
Date
用Date来描述时间,精确到毫秒。
空参构造时,默认当前计算机时间,有参构造时,使用指定的时间值
注意,修改毫秒值指的是在指定时间(默认为1970年1月1日)开始增加的毫秒值。
时间类自带的计算比我们用数学方法来自定义运算快多了。
而且可以直接比较大小(先后):
SimpleDateFormat
主要用来把时间格式转换成我们习惯看的字符格式,或者把字符串转换成时间格式。
SimpleDateFormat本质是一种格式化的规则对象,某种程度上可以看成一中字符串。
其中格式作为字符串pattern也有特殊的书写方式如下:
其中年作为y字符出现4次,表示年以四位数来表示,填充到字符串的yyyy的位置,其他同理。
其中如果后续添加字符:EE,则会输出周X,表示星期,其字符为中文,是因为当前虚拟机的运行环境是中文环境,如果需要英文表示可以手动设置为英文环境,代码如下:
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EE", Locale.ENGLISH);
也可以通过手动输入日期和pattern规则,将字符串日期转换成date对象,以使用时间计算相关的方法。
Calendar
因为Date对象每次更改都只能更改毫秒值,比较也是毫秒值间的大小比较,所以不太方便。
Calendar类不能直接创建对象,不能直接new。只能通过getInstance获取当前时间的日历对象。也就是通过一个静态方法获得子类对象,因为底层需要通过环境变量获取当前的系统环境。可以通过先获取当前的日期,再setTime来指定时间。
细节:Calendar看起来就像一个数组一样,存储了各种信息,不同的索引展示的数据如下:
例如:设定为2023年9月10日
注意,月份的范围是0~11,星期则是从周日(日返回1)开始。所以可以手写一个表用于检查。
JDK8新增时间类
JDK7中三个类在JDK8中被细分成了更多的类。
ZoneId时区
也是类似数组,但是无法直接通过索引来获取。
通过获取了时区类,可以和一些其他的时间类组合获取对应的时区的时间。
Instant时间戳
时间戳对象就是一个固定格式的字符串,类似SimpleDateFormate
ofxxxx指的是增加XXX时间后的时间点。
默认时间是标准时间,如果需要获取对应时区的时间要在后面加上时区对象。
ZoneDateTime带时区时间
需要注意的是of的参数。
JDK8的时间对象都是不可变的,所以修改时间的方法都是新建了一个新时间对象。
DateTimeFormatter 时间格式化类
类似SimpleDateFormat,将时间类型通过格式化来展示。
LocalDate LocalTime LocalDateTime日历类
Duration Period ChronoUnit工具类
工具类,通常用于时间长度间隔的计算。
例如:
三、包装类
就是基本数据类型的引用数据类型,例如常用的int类为基本数据类型,包装类就是Integer。
创造一个对象,把数据封装起来。
个人理解其实就是某种指针啦。
可以直接通过字符串来获取数值,但是这已经是过时的方法了。
在java中每次new都一定创造出新的对象,所以地址值一定不一样。
但是静态方法中,已经预置一些对象(-128~127),可以直接拿去用,就跟之前math类一样。
需要注意以前的模块中,需要将包装类的值使用静态方法拿出来再计算,之后就不用了。
JDK5以后提供了自动装箱和自动拆箱的机制。
自动装箱:把基本数据类型自动变成其对应的包装类 。
自动拆箱:把包装类自动变成其对象对应的基本数据类型。
至此可以直接进行包装类的计算并且赋予int类。
注意返回值是String类,因为int和long的最长整数可能装不下,也表示不了字母。

可以直接将字符串转换成整数,但字符串中不可以出现字母,只能出现数字。
八种包中类中,除了Character之外都有parseXXX的方法,进行字符串到对应类型转换

注意以后都用nextline,可以一次接受一整行的string。
总结
正则方法再数据检验的时候非常有用,以前写网页前端的时候不知道正则方法,总是自己手写逻辑,还要自己思考可能会出现的错误,学习正则以后一句话就能检验所有错误。
时间类的加减是很多应用类算法题最头疼的事情,什么闰年闰秒之前都是要手写逻辑来考虑,加加减减日月年真的痛苦,在学习了时间类以后这些事情都可以让虚拟机来一键完成。
还有包装类对象,以前接受字符串都是转换成char[]然后手写逻辑转换成数字挨个计算。现在可以直接转换成对应的类型。这个技巧在算法题中经常被使用,不过这样耗时也会蹭蹭上去。