正则表达式
1.1 概述
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
比如我们在网站上输入用户账号,要求我们输入的账号信息要符合账号的格式,而校验我们输入的账号格式是否正确正是由
正则表达式所控制的。
1.2 与普通方法的对比
案例:要求校验QQ账号的格式,账号信息全为数字,位数在6-12位之间。
我们不使用正则表达式进行编码:
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入QQ账号");
String a=sc.nextLine();
System.out.println(checkQQ(a));
}
//校验QQ账号信息的方法
public static boolean checkQQ(String a){
if(a==null){//账号为空则返回false
return false;
}
if(a.length()>12||a.length()<6){//控制账号长度
return false;
}
for(i=0;i<a.length();i++){
char c=a.char(i);//控制账号全为数字
if(c<"0"||c>"9"){
return false;
}
}
return true;//以上方法将非数字、超长度的情况进行了排除,留下来的必定符合要求
}
}
请输入QQ账号
87398177a
false
以上是我们不通过正则表达式来写的代码,可以看出来比较繁琐;
接下来我们用正则表达式来实现我们QQ账号信息的校验
public class Test{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入QQ账号");
String a=sc.nextLine();
System.out.println(checkQQ2(a));
}
public static boolean checkQQ2(String a){
return a!=null&a.matches("\\d{6,12}");//matches是使用正则表达式的方法
}
}
我们可以观察到正则表达式应用在校验数据格式的情况时代码非常的简单
1.3 匹配规则
字符类(默认只匹配一个字符)
符号 | 说明 |
---|---|
[abc] | 只能是a、b、c其中一个 |
[^abc] | 除了a、b、c都可以 |
[a-zA-Z] | a-z以及A-Z中的一个 |
[a-d[m-p]] | a-d或者m-p中的一个 |
[a-z&&[def]] | a-z和def的交集中的一个 |
预定义的字符类(默认只匹配一个字符)
符号 | 说明 |
---|---|
. | 任意字符 |
\d | 一个数字[0-9] |
\D | 非数字:[ ^0-9 ] |
\s | 一个空白符:[\t\n\x0B\f\r] |
\S | 非空白符:[^\s] |
\w | 英文、数字、下划线 [a-zA-Z_0-9] |
\W | 一个非单词英文[^W] |
贪婪的量词(配合匹配多个字符)
符号 | 说明 |
---|---|
X? | X,一次或者没有 |
X* | X,0次或者多次 |
X+ | X,一次或者多次 |
X{n} | X,n次 |
X{n,} | X,至少n次 |
X{n,m} | X,n-m次 |
1.4 常见案例
- 请编写程序模拟用户输入手机号码,验证格式是否正确并给出提示直到格式输入正确为止
- 请编写程序模拟用户输入邮箱号码,验证格式是否正确并给出提示直到格式输入正确为止
- 请编写程序模拟用户输入座机号码,验证格式是否正确并给出提示直到格式输入正确为止
import java.util.Scanner;
//正则表达式检查用户输入的数据是否符合要求
public class MobliePhoneCheck {
public static void main(String[] args) {
//checkMp();
//checkEmail();
checkTel();
}
//正则表达式检查用户输入的手机号码是否符合要求
public static void checkMp(){
Scanner sc = new Scanner(System.in);
while (true) {//巧用while循环 CTRL+alt+t 快速生成while循环
System.out.println("请输入您的手机号码");
String s=sc.nextLine();
if(s.matches("1[3-9]\\d{9}")){//手机号码开头为1、第二位数为3-9、后面再跟9为数字
System.out.println("手机号码输入成功");
break;//记得打破循环
}else {
System.out.println("手机号码格式有误");
}
}
}
//邮箱格式检测 [email protected] [email protected] [email protected] 满足三种形式
//数字位6-12位;一个@;邮箱类型含数字和英文;域名两级
public static void checkEmail(){
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入您的邮箱号码");
String s=sc.nextLine();
if(s.matches("\\d{6,12}@[a-zA-Z0-9]{2,3}(\\.[a-zA-Z]{3}){1,2}")){
System.out.println("邮箱输入成功");
break;
}
else {
System.out.println("邮箱格式有误");
}
}
}
//座机号码检测 区位三个,号码8个
public static void checkTel(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入座机号码");
String a=sc.nextLine();
if(a.matches("0\\d{2}-?\\d{8}")){
System.out.println("座机号码输入成功");
}else{
System.out.println("座机号码格式有误");
}
}
1.5 正则表达式的方法
方法名 | 说明 |
---|---|
public String replaceAll(String regex,String newStr) | 将正则表达式指定的内容替换成想要内容 |
public String[] split(String regex) | 将正则表达式指定的内容作为分隔符(注意返回的是数组) |
下面对方法进行演示
import java.util.Arrays;
public class ExpressionMethod {
public static void main(String[] args) {
//split 将正则表达式指定的格式作为分隔符分隔字符串并返回数组
String a="中交sadee二航局saj41523Jianzh建筑工程有限公司";
String[] s=a.split("[a-zA-Z0-9]+");
System.out.println(Arrays.toString(s));//用数组重写的toString打印
for (int i = 0; i < s.length; i++) {//或者for循环遍历出来
System.out.println(s[i]);
}
//replaceAll 将正则表达式指定的格式的内容替换成自己想要的内容
String b=a.replaceAll("[]a-zA-Z0-9]+","\t");
System.out.println(b);
}
1.6 拓展——爬取信息
在一堆杂乱的信息中获取到有效的信息:电话号码、邮箱等等......
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GetImformation {
//利用正则表达式在一堆信息中提取有效的信息
/*
来自中交二航局的牛马人编号20210710,电话17989148888;邮箱号码:[email protected]
*/
public static void main(String [] args){
String e="来自中交二航局的牛马人编号20210710,电话17989148888;邮箱号码:[email protected]";
//提取有效信息第一步: 先创建一个正大表达式规则
String a="\\d{9}@[a-zA-Z0-9]{2,3}(\\.[a-zA-Z]{3}){1,2}|\\d{1,11}|1[3-9]\\d{9}" ;
//第二步:编译规则并封装成一个编译器Pattern
Pattern p=Pattern.compile(a);//compile为编译的意思,将我们指定的规则编译
//第三步:调用编译器匹配功能生成一个匹配器 Matcher 即用编译器的规则去匹配目标内容
Matcher m = p.matcher(e);
//第四步:调用匹配器的查找功能:find;调用group方法将查找到的内容生成一个新的字符串:group
while (m.find()){
String g = m.group();
System.out.println(g);
}
}
}
标签:String,正则表达式,Day37,System,详解,println,public,out
From: https://www.cnblogs.com/CQliuwei/p/16972378.html