文章目录
正则表达式
概念
就是由一些特定的字符组成,代表的是一个规则
作用:
- 用来校验数据格式是否合法(更简洁,更便捷)
- 在一段文本中查找满足要求的内容
以下这段代码checkQQ1中的一行正则表达式代码,完成checkQQ里一堆代码所能实现的功能,这就是正则表达式。
package regex;
public class RegexTest1 {
public static void main(String[] args) {
System.out.println(checkQQ(null));
System.out.println(checkQQ("123456jhgf56"));
System.out.println(checkQQ("1234567895"));
System.out.println("------------------------------------");
System.out.println(checkQQ1(null));
System.out.println(checkQQ1("123456jhgf56"));
System.out.println(checkQQ1("1234567895"));
}
public static boolean checkQQ1(String qq){
return qq != null && qq.matches("[1-9]\\d{5,19}");
// 在这里:[1-9]的意思是首位必须是1-9,\\d{5,19}的意思是剩余有5-19位
}
public static boolean checkQQ(String qq){
//1、判断QQ号码是否为null
if (qq == null || qq.startsWith("0") || qq.length() < 6 ||qq.length() > 20){
return false;
}
//2、qq至少不是空,不是以0开头的,满足6-20之间的长度
//判断qq号码中是否都是数字
for (int i = 0; i < qq.length(); i++) {
//根据索引提取当前位置处的字符
char ch = qq.charAt(i);
//判断ch记住的字符,如果不是数字,qq不合法
if (ch < '0' || ch > '9'){
return false;
}
}
//3、说明qq号码肯定是合法的
return true;
}
}
//输出:
false
false
true
------------------------------------
false
false
true
书写规则
https://doc.qzxdp.cn/jdk/17/zh/api/java.base/java/util/regex/Pattern.html
每次只能匹配单个字符
预定义字符:
应用案例1:校验数据合法
需求:校验用户输入的电话、邮箱、时间是否合法
package regex;
import java.util.Scanner;
public class RegexTest3 {
public static void main(String[] args) {
checkPhone();
checkEmail();
checkTime();
}
public static void checkPhone() {
while (true) {
System.out.println("输入电话或座机:");
Scanner sc = new Scanner(System.in);
String phone = sc.nextLine();
if(phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})")){
System.out.println("bingo!");
break;
}else {
System.out.println("fail");
}
}
}
public static void checkEmail() {
while (true) {
System.out.println("输入Email:");
Scanner sc = new Scanner(System.in);
String phone = sc.nextLine();
if(phone.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")){
System.out.println("bingo!");
break;
}else {
System.out.println("fail");
}
}
}
//不知道对不对
public static void checkTime() {
while (true) {
System.out.println("输入时间:");
Scanner sc = new Scanner(System.in);
String phone = sc.nextLine();
if(phone.matches("(\\d{4})-(\\d{2})-(\\d{2})\\s+(([0-1][0-9])|(2[0-4]):([0-5][0-9]):([0-5][0-9]))")){
System.out.println("bingo!");
break;
}else {
System.out.println("fail");
}
}
}
}
应用案例2:用于查找信息
在一段文本中查找满足要求的内容
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest4 {
public static void main(String[] args) {
method1();
}
private static void method1() {
String data ="来黑马程序员学习Java,\n" +
" 电话:1866668888,18699997777 \n" +
" 或者联系邮箱:boniu@itcast.cn,\n" +
" 座机电话:01036517895,010-98951256\n" +
" 邮箱:bozai@itcast.cn,\n" +
" 邮箱:dlei0009@163.com,\n"+
" 热线电话:400-618-9090 ,400-618-4000,4006184000,4006189090";
//1、定义爬取规则
String regex = "((1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19}))|(\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2})"
+ "|(400-?\\d{3,7}-?\\d{3,7})";
//2、把正则表达式封装成一个Pattern对象
Pattern pattern = Pattern.compile(regex);
//3、通过pattern对象去获取查找内容的匹配器对象
Matcher matcher = pattern.matcher(data);
//4、定义一个循环开始爬取信息
while(matcher.find()){
String rs = matcher.group(); //获取到找到的内容了
System.out.println(rs);
}
}
}
应用案例3:用于搜索替换、分割内容
需求:
package regex;
import java.util.Arrays;
public class RegexTest5 {
public static void main(String[] args) {
//1、按照正则表达式匹配的内容进行替换
String s1 = "古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";
System.out.println(s1.replaceAll("\\w+", "-"));
//1.2、某语音系统,收到一个口吃的人说“我喜欢编编编程程程!”, 需要优化成“我喜欢编程!”
/*
(.)一组:.匹配任意字符
\\1:为这个组声明一个组号:1号
+:声明必须是重复的字
$1:可以取到第1组代表那个重复的字
*/
String s2 = "我喜欢编编编程程程!";
System.out.println(s2.replaceAll("(.)\\1+", "$1"));
//2、public String[] split(String regex):按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
//需求:把 古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴 中的人名获取出来
String s3 ="古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";
String[] names = s3.split("\\w+");
System.out.println(Arrays.toString(names));
}
}
异常
异常就是代表程序出现的问题。
实际开发里面,专业的应该使用异常把问题封装后再给出去
认识异常
SUN公司在处理程序出现的问题时,方法一旦出现问题,方法的内部就会把这个问题的信息封装成一个所谓的异常对象,然后把这个异常对象从这个main方法中抛出去,抛给JVM虚拟机。JVM收到异常对象后,会把程序先停下来,再把异常对象打印出来。打印出来的异常对象里面就会包含该问题的很多信息。
- 异常的体系有:
如果程序遇到编译时异常,想先继续往下写,就要用到:
-
捕获异常(try catch): 把程序可能出现的异常抓起来。try试图监视 catch捕获。
try{ //监视可能出现的异常! }catch(异常类型1 变量){ //处理异常 }catch(异常类型2 变量){ //处理异常 }
- 抛出异常(throws ParseException):在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理,也就是找上一层程序抛出
方法 throws 异常1,异常2,异常3..{
...
}
自定义异常
Java无法为这个世界上全部的问题都提供异常类来代表,如果企业自己的某种问题,想通过异常来表示,
以便用异常来管理该问题,那就需要自己来定义异常类了。
- 自定义异常种类:
- 自定义运行时异常
package exception;
public class ExceptionTest1 {
public static void main(String[] args) {
//保存一个合法的年龄
try {
saveAge(12);
System.out.println("底层执行成功!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("底层出现了bug");
}
}
public static void saveAge(int age){
if (age>0 && age<150){
System.out.println("年龄被成功保存:" +age);
}else {
//用一个异常对象封装这个问题
//throw 抛出去这个异常对象
throw new AgeIllegalRuntimeException("/age is illegal, your age is" + age);
}
}
}
package exception;
//1、必须让这个类继承自RuntimeException,才能成为一个运行时异常类
public class AgeIllegalRuntimeException extends RuntimeException{
public AgeIllegalRuntimeException() {
}
public AgeIllegalRuntimeException(String message) {
super(message);
}
}
- 自定义编译时异常
package exception;
public class ExceptionTest1 {
public static void main(String[] args) {
//保存一个合法的年龄
try {
saveAge(12);
System.out.println("底层执行成功!");
} catch (AgeIllegalException e) { //
e.printStackTrace();
System.out.println("底层出现了bug");
}
}
public static void saveAge(int age) throws AgeIllegalException{ //
if (age>0 && age<150){
System.out.println("年龄被成功保存:" +age);
}else {
//用一个异常对象封装这个问题
//throw 抛出去这个异常对象
//throws用在方法上,抛出方法内部的异常
throw new AgeIllegalException("/age is illegal, your age is" + age);
}
}
}
package exception;
//1、必须让这个类继承自Exception,才能成为一个运行时异常类
public class AgeIllegalException extends Exception{
public AgeIllegalException() {
}
public AgeIllegalException(String message) {
super(message);
}
}
如果这个问题很严重,很容易犯,就用编译时异常,反之选运行时异常
异常有什么用?
- 异常是用来查寻系统bug的关键参考信息
- 异常可以作为方法内部一种特殊返回值,以便通知上层调用者底层的执行情况
异常的处理
1、捕获异常,记录异常并响应合适的信息给用户
- 具体代码
package exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionTest2 {
public static void main(String[] args) {
try {
test1();
} catch (FileNotFoundException e) {
System.out.println("找的文件不存在");
e.printStackTrace(); //打印出这个异常对象的信息
} catch (ParseException e) {
System.out.println("解析的时间有问题");
e.printStackTrace(); //打印出这个异常对象的信息
}
}
public static void test1() throws FileNotFoundException, ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse("2018-11-11 10:24:11");
System.out.println(d);
test2();
}
public static void test2() throws FileNotFoundException {
//读取文件
InputStream is = new FileInputStream("D:/xinjian.txt");
}
}
- 2个异常具体怎么执行的:
如何优化?
写法上的优化:由于实际开发中,我们不知道实际执行中有什么异常,所以可以都用Exception,这个父类可以处理所有异常
package exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionTest2 {
public static void main(String[] args) {
try {
test1();
} catch (Exception e) {
System.out.println("您的操作有问题!");
e.printStackTrace(); //打印出这个异常对象的信息
}
}
public static void test1() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse("2018-11-11 10:24:11");
System.out.println(d);
test2();
}
public static void test2() throws Exception {
//读取文件
InputStream is = new FileInputStream("D:/xinjian.txt");
}
}
2、捕获异常,尝试重新修复
package exception;
import java.util.Scanner;
public class ExceptionTest3 {
public static void main(String[] args) {
//需求:调用一个方法,让用户输入一个合适的价格返回为止
System.out.println(getMoney());
}
private static double getMoney() {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("输入合适的价格:");
double money = sc.nextDouble();
if (money >= 0){
return money;
}else {
System.out.println("输入的不对");
}
}
}
}
如果输入字母,会报错、
现在的代码就比较健壮了:
package exception;
import java.util.Scanner;
public class ExceptionTest3 {
public static void main(String[] args) {
//需求:调用一个方法,让用户输入一个合适的价格返回为止
//尝试修复
while (true) {
try {
System.out.println(getMoney());
break;
} catch (Exception e) {
System.out.println("输入合法的数字!");
}
}
}
private static double getMoney() {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("输入合适的价格:");
double money = sc.nextDouble();
if (money >= 0){
return money;
}else {
System.out.println("输入的不对");
}
}
}
}