正则表达式
正则表达式虽然不需要我们深入研究,但是必须看懂其中的意思,以及明白一些它的语法
以下是一些简单的正则表达式的语法,需要我们去牢记它
字符
x x字符
\\ 反斜线字符
\t 制表符
\n 换行符
\r 回车符
字符类:
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
预定义字符类:
. 任何字符 如果本身就是. \. qq.com 写正则表达式(\\.)
\d 数字:[0-9] 写正则表达式 :\\d
\w 单词字符:[a-zA-Z_0-9]:字母大小写,数字字符 \\w
边界匹配器:
^ 行的开头
$ 行的结尾
\b 单词边界 尾 (helloword?haha:world)
Greedy 数量词(重点)
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X字符恰好出现n次
X{n,} X字符至少出现n次
X{n,m} X字符至少出现n次,但不超过m次
正则表达式的引入:
在我们还没有学习正则表达式之前,当需要我们去检测一个QQ号的格式是否正确,就需要我们用普通if-else语句去一步一步书写
例如:
package practiceDome; import java.util.Scanner; //检测QQ public class Text5 { public static void main(String[] args) { //创建键盘录入QQ号码 Scanner sc=new Scanner(System.in); System.out.println("请您输入您的QQ号码"); String QQ=sc.nextLine(); boolean flag=checkQQ(QQ);//调用下面的静态方法 System.out.println("flag:"+flag); } //创建一个静态的方法去判断QQ所需要的要求 public static boolean checkQQ(String QQ) { boolean flag=true; if(QQ.length()>=5&&QQ.length()<=10) { //判断QQ的位数是不是在5位数到10位数之间 if(!QQ.startsWith("0")) { //判断QQ的开头是不是以0开头的 char[] ch=QQ.toCharArray(); //将Sstring类型的数组转换成字符数组类型 for(int x=0;x<ch.length;x++) { char c=ch[x]; if(!Character.isDigit(c)) { //判断转换成的字符数组是不是数字 flag= false; break; } } }else { flag= false; } }else { flag= false; } return flag; } }
通过正则表达式之后,我们可以对上述代码进行优化,例如:
package practiceDome; import java.util.Scanner; //QQ改进版用正则表达式去编译 public class Text6 { public static void main(String[] args) { //创建一个键盘录入对象 Scanner sc=new Scanner(System.in); System.out.println("请您输入您的QQ号:"); String QQ=sc.nextLine(); boolean flag=checkqq(QQ); System.out.println("flag:"+flag); } public static boolean checkqq(String qq) { // String s="[1-9][0-9] {4,14}"; // boolean flag=qq.matches(s); // return flag; // 下面的返回值是上面的简写方式 return qq.matches("[0-9][1-9]{4,15}"); } }
以上两种方法都可以检测出来我们的QQ号,但是对比之后,发现运用正则表达式的代码则很简单方便。
下面让我们用正则表达式进行一些小练习:
检测手机号码:
package practiceDome; import java.util.Scanner; //用正则表达式去检测手机号码 public class PhoneRegexDome { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请您输入您的手机号码:"); String number =sc.nextLine(); boolean flag=checknum(number); System.out.println("flag:"+flag); } public static boolean checknum(String number) { String regex="1[1-9]\\d{9}"; return number.matches(regex); } }
检测邮箱号码:
package practiceDome; import java.util.Scanner; //用正则表达式去检测手机号码 public class PhoneRegexDome { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请您输入您的手机号码:"); String number =sc.nextLine(); boolean flag=checknum(number); System.out.println("flag:"+flag); } public static boolean checknum(String number) { String regex="1[1-9]\\d{9}"; return number.matches(regex); } }
下面让我们来学习一个正则表达式的方法:
public String[] split(String regex) :字符串的分割功能
package com.Math; public class splitDome2 { public static void main(String[] args) { String s="18-23"; String[] str=s.split("-"); int d1=Integer.parseInt(str[0]); int d2=Integer.parseInt(str[1]); int height=20; if(height>=d1&&height<=d2) { System.out.println("你是这个范围的哦"); }else { System.out.println("很遗憾你不是..."); } } } 运行结果:你是这个范围的哦
分割方法除了分割这个“-”符号外,还有其他符号需要我们在书写上注意
例如:
package com.Math; public class SplitDome3 { public static void main(String[] args) { //当分割的符号是“,”时 String s="aa,bb,cc"; String[] str=s.split(","); for(int x=0;x<str.length;x++) { System.out.print(str[x]+" "); } System.out.println("-----------------"); //当分割的符号是"."时,需要我们注意敲代码时应该写"\\." String s2="aa.bb.cc"; String[] str2=s2.split("\\."); for(int x=0;x<str2.length;x++) { System.out.print(str2[x]+" "); } System.out.println("--------------------"); //当我们的中间空格数量不一时,在书写时应该用" +" String s3="aa bb cc"; String[] str3=s3.split(" +"); for(int x=0;x<str3.length;x++) { System.out.print(str3[x]+" "); } System.out.println("---------------------"); //当遇到电脑上文件保存的路径,书写"\\"应该写成"\\\\" String s4="F:\\java\\bin\\jdk"; String[] str4=s4.split("\\\\"); for(int x=0;x<str4.length;x++) { System.out.print(str4[x]+" "); } } } 运行结果: aa bb cc ----------------- aa bb cc -------------------- aa bb cc --------------------- F: java bin jdk
例题:
当我们想让一个字符串数组排序排时
package practiceDome; import java.util.Arrays; //有一个字符串将它按从小到大排序好 public class splitArraysDome { public static void main(String[] args) { String s="23 56 67 54 34"; String[] str=s.split(" "); //创建一个长度固定的int数组 int[] arr=new int[str.length]; for(int x=0;x<arr.length;x++) { //将字符串数组遍历后转换成int类型数组 arr[x]=Integer.parseInt(str[x]); } Arrays.sort(arr); //将int数组转变成字符串数组 StringBuilder sb=new StringBuilder(); for(int x=0;x<arr.length;x++) { sb.append(arr[x]).append(" "); } //将int类型转变成字符串数组并去除两端空格 String t= sb.toString().trim(); System.out.println(t); } 运行结果:23 34 54 56 67 替换功能: public String replaceAll(String regex,String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 例如: package practiceDome; public class regexDome { public static void main(String[] args) { String str="adgasgh1345648AGDASGHYBA"; //定义需要替换掉的数字 String regex="\\d+"; //定义替代的*号 String s="*"; String result=str.replaceAll(regex, s); System.out.println("result:"+result); } } 运行结果: result:adgasgh*AGDASGHYBA
当判断字符串是否符合正则表达式,牵引出模式和匹配器的调用:
将正则表达式编译成一个模式对象
public static Pattern compile(String regex)将给定的正则表达式编译到模式中
通过模式对象,构造一个匹配器对象(Matcher对象)
Matcher matcher(String input) :模式对象转换成匹配器对象
匹配器对象有一个方法:machers() ; 直接对当前字符串数据进行校验,返回boolean类型值
public boolean matches()
例如 :
package practiceDome; import java.util.regex.Matcher; import java.util.regex.Pattern; public class patternDome { public static void main(String[] args) { //定义一个字符串 String regex="a+b";//a+代表a出现一次或多次 //将需要判断的正则表达式放进创建好的模式中 Pattern p=Pattern.compile(regex); //通过模式对象创建一个匹配器对象(matcher方法) Matcher m=p.matcher("b");//这里a一次也没有出现,所以结果应该是false //调用匹配器方法(macthes)去检测 boolean flag=m.matches(); System.out.println("flag:"+flag); } } 运行结果: flag:false
但是上述方法显得有点繁琐,在实际中有时候并不怎么常用,所以我们一般用下面这种方法,具体用哪种方法还得具体看
例如:
package practiceDome; import java.util.regex.Matcher; import java.util.regex.Pattern; public class patternDome { public static void main(String[] args) { //定义一个字符串 String regex="a+b";//a+代表a出现一次或多次 //将需要判断的正则表达式放进创建好的模式中 Pattern p=Pattern.compile(regex); //通过模式对象创建一个匹配器对象(matcher方法) Matcher m=p.matcher("b");//这里a一次也没有出现,所以结果应该是false //调用匹配器方法(macthes)去检测 boolean flag=m.matches(); System.out.println("flag:"+flag); System.out.println("==================="); String s="b"; //直接调用matches方法去检测 boolean flag1=s.matches(regex); System.out.println("flag:"+flag1); } } 运行结果: flag:false =================== flag:false
根据上例,从两者进行比较,我们不难发现第二种方法更加简单方便,所以具体怎么用得看自己