一、正则表达式:
1、定义
使用一些具有特殊含义的元字符,编写字符串的匹配规则
Regex ---- Pattern
案例
Pattern p = Pattern.compile("a*b");//基于传入的正则构建正则表达式对象
Matcher m = p.matcher("aaaaab");//调用匹配器,匹配传入的字符串
boolean b = m.matches();//判断是否匹配成功
2、常用元字符
元字符 | 意义 |
---|---|
. | 匹配除换行符以外的任意字符 |
* | 匹配前一个字符出现0次或多次 |
+ | 匹配前一个字符出现至少一次 |
{n} | 匹配前一个字符出现n次 |
{n,m} | 匹配前一个字符出现>=n且<=m次 |
{n, } | 匹配前一个字符出现至少n次 |
^ | 匹配开始位置,eg:匹配以abc开始:^abc |
$ | 匹配结束的位置,eg:匹配以jpeg结束:jpeg¥ |
[] | 匹配其中的任意字符,eg:f[oa]t: fat fot |
[-] | 如果连字符“-”在选择匹配中出现,可以表示区间范围 [a-zA-Z],[0-9] |
[^] | 排除选择匹配中出现的所有字符,f[ ^ao]t:ft |
() | 分组捕获,出现在括号的内容会被添加到一个数组中,并且从1开始编号,被分组后的内容可以根据编号进行反向引用, \\1(从捕获的数组中提取下标为1的单元) |
| | 表示或者 "ab|cd",匹配只能是ab或者cd |
\d | 匹配0-9任意一个数 |
\s | 匹配特殊的控制符,空格 ,制表符,换行符 |
\w | 与[a-zA-Z]相同 |
3、方法说明
group(int [i]) //从捕获的分组中提取指定下标的单元,但是在调用之前一定要先确认是否匹配成功。即现调用matches()为true时在提取
如果group参数为0表示提取数组中第一个元素也就是完全匹配的所有内容
爬虫案例:
//爬虫
String content = "<a href=\"https://www.baidu.com?abc=354sdfsdf\">百度</a>";
//从a标签上提取url地址 - 正则
Pattern pattern = Pattern.compile("<a href=\"(.*)\">百度</a>");
Matcher matcher = pattern.matcher(content);
//System.out.println(matcher.matches());
if(matcher.matches()){
//提取url
String group = matcher.group(1);
System.out.println(group);
}
练习: 1、匹配手机号是否符合规范 2、匹配邮箱地址是否符合规范
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo3exercise {
public static void main(String[] args) {
//1.匹配手机号是否符合规范
//2.匹配邮箱地址是否规范
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("选择判断:1,手机判断 2.邮箱判断");
System.out.println("输入选则:");
int i = scanner.nextInt();
switch (i) {
case 1:
System.out.println("请输入手机号");
String next = scanner.next();
System.out.println(phone(next));
break;
case 2:
System.out.println("请输入邮箱");
String next2 = scanner.next();
System.out.println(emile(next2));
break;
default:
System.out.println("输入有误");
}
}
}
//手机号
public static boolean phone(String number){
Pattern pattern = Pattern.compile("1([3-5]|[7-9])\\d{9}");
Matcher matcher = pattern.matcher(number);
boolean falg = matcher.matches();
return falg;
}
//邮箱
public static boolean emile(String text){
Pattern pattern = Pattern.compile("((\\d{6,11})|(\\w{4,8})|(\\w{4}\\d{4,7}))@((\\w{2,7}.){1,2}|(163.)|(\\w{4}.))(com)|(net)");
Matcher matcher = pattern.matcher(text);
boolean falg = matcher.matches();
return falg;
}
}
二、数学相关类
1、 Math
方法 | 意义 |
---|---|
addExact(5,19====》24 | 加法运算 |
subtractExact(25,9)====》16 | 减法运算 |
multiplyExact(2,5)====》10 | 乘法运算 |
floorDiv(3,2)====》1 | 除法运算 |
abs(-9)====》9 | 绝对值 |
pow(2,3)====》8 | 次幂 |
max(8,9)====》9 | 最大值 |
min(2,7)====》2 | 最小值 |
random(10)====》0-9之间的 | 随机数 |
ceil(2.5)====》3 | 向上取整 |
floor(2.5)====》2 | 向下取整 |
注意:对于浮点数而言,在计算机底层做换算时会被转为无限循环的小数:
1.3--1.333333333;所以在处理精度要求更高的场景推荐使用下面的类:
2、BigDecimal
在BigDecimal中,数值会被作为字符串进行处理。
//将数值封装为BigDecimal对象
BigDecimal num1= new BigDecimal("数字"); BigDecimal num2= new BigDecimal("数字");
常用方法:
方法 | 意义 |
---|---|
num1.add(num2) | 加法 |
num1.subtract(num2) | 减法 |
num1.multiply(num2) | 乘法 |
num1.divide(num2) | 除法 |
num1.abs(num2) | 绝对值 |
num1.pow(num2) | 次幂 |
num1.max(num2) | 最大 |
num1.min(num2) | 最小 |
案例:
BigDecimal num1= new BigDecimal("数字");
BigDecimal num2= new BigDecimal("数字");
BigDecimal divide = n1.divide(n2);
System.out.println(divide.doubleValue());
三、包装类
针对java里的基本数据类型(基本类型变量上没属性和方法)。而java称为纯面向对象语言,因而对基本类型做了相应的包装类型。
基础类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
注意:自jdk1.5开始,java支持基础类型赋值给包装类型,反之亦然
包装类型 = 基础类型 //封箱
基础类型 = 包装类型 //开箱
封箱的过程实际上调用了包装类身上的valueOf()方法实现
Integer valueOf(int i);
拆箱的过程实际上调用了包装类身上的*Value()方法实现
四、日期类、
在方法身上添加了@Deprecated注解从,官方即将在以后的版本不在使用,准备废弃
jdk1.8之前:
Date //表示日期类
-getTime() //返回从1970-1-1 0:0:0到当前的时间毫秒值
Calender //日历
-- getInstance() //返回当前日期的Calender对象
--set //设置时间
SimpleDateFormat //日期格式化
---SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
--format(Date date)//将日期对象根据格式转化为对应的字符串
jdk1.8开始:
LocalDataTime 日期时间
LocalData 日期
LocalTime 时间
---now() //返回当前日期的LocalDateTime对象
---of(....) //将指定的日期时间转换为LocalDateTime对象
LocalDateTime now = LocalDateTime.now();
String format = now.format(DateTimeFormatter,ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(format);
五、异常类
1、定义
异常是java中用于问题反馈的机制。(ERROR 错误, Exception异常)
ERROR:不应该尝试捕获,是程序正常运行过程中出现的不可避免的严重问题
Exception:异常对于程序员来说是可控的。
错误和异常都是直接继承java.lang.Throwable
2、异常处理方式:
1.在方法上可以抛出异常
throws 异常类型
2.捕获异常
try{
//可能会存在异常的代码
}catch(异常类型 变量){
//异常处理
}catch(异常类型 变量){
//异常处理
}. . . . . . . .
finally{
//无论是否有异常产生都会被调用
}
3、异常的分类
编译时异常:在编译阶段抛出的异常,这种异常是必须要解决的。----使用上面的异常处理方法
运行时异常:
在运行的时候有可能会出现的异常,这种异常可以处理也可以不处理。
如果该异常是RuntimeExpection的子类就属于运行时异常;
4、如何通过抛异常进行问题反馈
可以通过throw 配合异常实现
在方法中:
throw new 异常类(“”);
注意:如果是抛出编译时异常,则需要在方法参数列表后使用throws抛出,如果是运行时异常,可以不用在方法上抛。
5、异常捕获处理办法
a、如果捕获的每个异常都有自己的处理办法,就需要分别捕获
b、如果所有异常处理都相同,则可以直接找这些异常的共同父类
c、如果多个异常需要分组处理,那么同一组的异常之间可以用 | 隔开,-----jdk1.7 (不能出现有直接继承关系的异常类)
6、自定义异常
类去继承Expexction,相当于写了一个编译时异常类。
类继承RuntimeExpection----相当于自定义一个运行时异常
练习:
1、输入一个字符串和一个数字,数字表示字节个数,然后按照指定的字节个数来截取这个字符串,要求不准出现半个字符的现象
import java.util.Scanner;
/**输入一个字符串和一个数字,数字表示字节个数,然后按照指定的字节个数来截取这个字符串,
要求不准出现半个字符的现象*/
public class exercise1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入字符串");
String str = scanner.next();
System.out.println("请输入截取的位数");
int num = scanner.nextInt();
ffi(str, num);
}
}
public static void ffi(String str,int num){
char[] chars = str.toCharArray();
int index=chars.length/ num;
for (int i = 0; i <index ; i++) {
String s = new String(chars, num * i, num);
System.out.println(s);
}if (chars.length%num!=0){
String x = new String(chars, num * index,chars.length-num *index);
System.out.println(x);
}
}
}
2、输入一个字符串,提取这个字符串中的数字并求和 -> sdf85dfghd72s6 -> 8 5 7 2 6 -> 28
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*2、输入一个字符串,提取这个字符串中的数字并求和 -> */
public class exercise2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入字符串");
String str = scanner.next();
System.out.println(ff2(str));
}
}
public static int ff2(String str){
Pattern pattern= Pattern.compile("\\d");//设置一位数子
Matcher matcher = pattern.matcher(str);
int sum=0;
while (matcher.find()){//每次找到一位数
String group = matcher.group();
int i = Integer.parseInt(group);
sum+=i;
}
return sum; }
}
3、输入一个字符串,提取这个字符串中的数字并排序->sdf85dfghd72s6 -> 8 5 7 2 6 -> 2 5 6 7 8
import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*输入一个字符串,提取这个字符串中的数字并排序->sdf85dfghd72s6 -> 8 5 7 2 6 -> 2 5 6 7 8*/
public class exercise3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入字符串");
String str = scanner.next();
System.out.println(Arrays.toString(ff3(str)));
}
}
public static int[] ff3(String str){
Pattern pattern= Pattern.compile("\\d");//设置一位数子
Matcher matcher = pattern.matcher(str);
//先获取找到的数字的个数确定数组的长度
int num=0;
while (matcher.find()){//每次找到一位数
num++;}
//找完了,要重置Matcher对象,不然数据就是为0
matcher.reset();
int[] arr=new int[num];//将找到的个数设置为字符数组的长度
int index=0;//填入元素
while (matcher.find()){//每次找到一位数
String group = matcher.group();
int i = Integer.parseInt(group);
arr[index]=i;
index++;
}
Arrays.sort(arr);
return arr;}
}
4、输入一个字符串,利用charAt方法判断这个字符串是否是一个回文字符串
import java.util.Scanner;
/*4、输入一个字符串,利用charAt方法判断这个字符串是否是一个回文字符串*/
public class exercise4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入字符串");
String str = scanner.next();
System.out.println(ff4(str));
}
}
public static boolean ff4(String str){
char[] chars = str.toCharArray();
for (int i = 0 ,j=chars.length-1; i <chars.length&&j>0 ;i++,j--) {
if (chars[i]!=chars[j]){
return false;
}
} return true;
}
}
5、输入一个字符串,统计每个字符出现的个数---hsoafngifaoa -> h:1 s:1 o:2 a:3 f:2 n:1 g:2 i:1
/*5、输入一个字符串,统计每个字符出现的个数---hsoafngifaoa -> h:1 s:1 o:2 a:3 f:2 n:1 g:2 i:1*/
public class exercise5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入字符串");
String str = scanner.next();
ff5(str);
}
}
public static void ff5(String str) {
//定义一个新的字符串遍历原本的字符串,在新的如果没有出现就添加
String s ="";
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
//判断是否出现在新的字符串
int num = s.indexOf(c, 0);
if (num==-1){
//没有出现过就加进去
s+=c;
}
}
//将s字符串变成字符数组
char[] ss = s.toCharArray();
char[] chars = str.toCharArray();
for (int i = 0; i < ss.length; i++) {
int num=0;
for (int j = 0; j <chars.length ; j++) {
if (chars[i]==chars[j]){
num++;
}
}
System.out.println(chars[i]+":"+num);
}
}
}