正则表达式:
指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
(符合一定规则的字符串)
范例:
package cn.itcast_01;
import java.util.Scanner;
/*
* 正则表达式
* 范例:
* 输入一个QQ号码(5~15位)
* 开头字符不能为0
*/
public class RegexDemo {
public static void main(String[] args) {
//创建键盘输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.nextLine();
}
//定义一个判断规则方法
public static boolean checkQQ(String qq){
String regex ="[1-9] [0-9]{4,14}";
//public boolean maches(String regex) 告知此字符串是否匹配给定的正则表达式
boolean flag =qq.matches(regex);
return flag;
}
}
________________________________________________________________
正则表达式的组成规则
规则字符在java.util.regex Pattern类中
常见组成规则:
字符:
x 字符 x 。举例:‘a' 表示字符a
\\ 反斜线字符
\n 新行(换行)符
\r 回车符
字符类:
把很多放在一起的容器
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
预定义字符类
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\w | 单词字符:[a-zA-Z_0-9] 在正则表达式里面组成单词的必须是这些 |
\W | 非单词字符:[^\w] |
边界匹配器
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 就是不是单词字符的地方 举例:hello world?haha;xixi(只要不是单词字符的就是单词边界) |
数量词
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
________________________________________________________________
正则表达式的应用
判断功能:
public boolean matches(String regex)
使用的是String类的matches方法
范例:
package cn.itcast_02;
import java.util.Scanner;
/*
* 判断功能
* 使用的是String类的matchs方法
* 需求:
* 判断手机号码是否满足要求
*
* 思路:
* A/ 键盘录入手机号码
* B/ 定义手机号码的规则
* 13436975980
* 13688886868
* 13866668888
* 18912356849
* 18866559797
* 18356462132
*
* C/ 调用功能判断即可
*/
public class RegexDemo {
public static void main(String[] args) {
//键盘录入手机号码
Scanner sc =new Scanner(System.in);
System.out.println("输入手机号码");
String phone = sc.nextLine();
//定义手机规则
String regex = "1[38]\\d{9}";
//调用功能
boolean flag =phone.matches(regex);
//输出结果
System.out.println("flag:"+flag);
}
}
练习01:校验邮箱
package cn.itcast_03;
import java.util.Scanner;
/*
* 练习:校验邮箱
*
* 思路:
* A/ 键盘输入邮箱
* B/ 定义邮箱规则
* C/ 调用功能判断即可
*/
public class RegexTest_01 {
public static void main(String[] args) {
//键盘输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的邮箱:");
String mail = sc.nextLine();
//定义邮箱规则
String mailRegex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]{2,3})+";
//调用功能
boolean flag = mail.matches(mailRegex);
//输出结果
System.out.println("flag:"+flag);
}
}
分割功能
public String[ ] split(String regex)
范例
package cn.itcast_04;
import java.util.Scanner;
/*
* 分割功能
* String类的split方法
* 举例:
* 百合网,世纪佳缘,珍爱网,QQ
* 搜索好友
* 性别:女
* 年龄:"18-24"
*
*/
public class RegexDemo {
public static void main(String[] args) {
// 定义一个年龄搜索范围
String ages = "18-24";
// 定义规则
String regex = "-";
// 调用方法
String[] strArray = ages.split(regex);
/* // 遍历:
for (int x = 0; x < strArray.length; x++) {
System.out.println(strArray[x]);
}
*/
//如何拿到int类型的值
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[strArray.length-1]);
/* System.out.println(startAge);
System.out.println(endAge);*/
//键盘录入年龄
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄");
int age = sc.nextInt();
//判断
if(age>=startAge && age<=endAge){
System.out.println("你就是我想找的");
}
else{
System.out.println("滚");
}
}
}
练习01:
package cn.itcast_04;
/*
* 分割功能练习
* 定义一个字符串"aa,bb,cc"
* 分割成aa bb cc
*/
public class RegexTest_01 {
public static void main(String[] args) {
//定义一个字符串
String s1="aa,bb,cc";
//直接分割
String[] str1Array = s1.split(",");
for(int x=0;x<str1Array.length;x++){
System.out.println(str1Array[x]);
}
System.out.println("-----------------------");
String s2 = "aa.bb.cc";
String[] str2Array = s2.split("\\.");
for(int x=0;x<str2Array.length;x++){
System.out.println(str2Array[x]);
}
System.out.println("-----------------------");
String s3 = "aa bb cc";
String[] str3Array = s3.split(" +"); //+是一次或一次以上
for(int x=0;x<str3Array.length;x++){
System.out.println(str3Array[x]);
}
System.out.println("-----------------------");
//硬盘上的路径,应该用\\替代\
String s4 = "G:\\VX\\sorfware";
String[] str4Array = s4.split("\\\\"); // 规则中\\代表别人\个
for(int x=0;x<str4Array.length;x++){
System.out.println(str4Array[x]);
}
}
}
练习02:
package cn.itcast_04;
/*
* 分割功能练习:
* 一个字符串"91 27 46 38 50"
* 需求:输出结果"27 38 46 50 91"
* 思路:
* A/将字符串分割成字符数组
* B/用冒泡方法重新排序
* C/将字符串数组从新拼接成字符串
* D/输出
*
*/
public class RegexTest_02 {
public static void main(String[] args) {
//定义字符串
String s = "91 27 46 38 50";
//将字符串分割成字符数组
String[] strArray = s.split(" ");
/* //遍历打印数组看看分割是否正确
for(int x=0;x<strArray.length;x++){
System.out.println(strArray[x]);
}*/
//通过冒泡排序,将字符数组重新排序
for(int x=0;x<strArray.length-1;x++){
for(int y=0;y<strArray.length-1-x;y++){
if(Integer.parseInt(strArray[y]) > Integer.parseInt(strArray[y+1])){ //将字符串元素转换成Int类型进行比较
String temp = strArray[y];
strArray[y]=strArray[y+1];
strArray[y+1]=temp;
}
}
}
/* System.out.println("---------------------");
//遍历打印字符数组看看排序是否正确
for(int x=0;x<strArray.length;x++){
System.out.println(strArray[x]);
}
*/
//将字符数组重新拼接成字符串
StringBuffer sb = new StringBuffer();
for(int x=0;x<strArray.length;x++){
sb.append(strArray[x]).append(" ");
}
String s1 = sb.toString();
System.out.println("输出结果是:"+s1);
}
}
替换功能
public String replaceAll(String regex. String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
范例:
package cn.itcast_05;
/*
* 替换功能
* String类的replaceAll方法
*/
public class RegexDemo {
public static void main(String[] args) {
//定义一个字符串
String s = "helloqq12345worldkh622112345678java";
//需求:去除所有的数字,用*替换掉
//定义规则
// String regex = "\\d+"; //出现数字就给一颗*
String regex = "\\d"; //出现一个数字就给一颗*
String ss = "*";
String result = s.replaceAll(regex, ss);
System.out.println("result:"+result);
}
}
获取功能
Pattern 和 Matcher类的使用
Pattern 正则表达式的编译表示形式。
模式和匹配器的典型的调用顺序是:
范例:Pattern p = Pattern.compile
("a*b"); //将正则表达式便宜成模式对象 Matcher m = p.matcher
("aaaaab"); //通过模式对象得到匹配器对象,这个时候需要的是匹配的字符串 boolean b = m.matches
(); //调用匹配器对象的功能
package cn.itcast_06;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 获取功能:获取下面字符串中由三个字符组成的单词
* da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
*/
public class RegexDemo2 {
public static void main(String[] args) {
//定义字符串:
String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
//把规则编译成模式对象
Pattern p = Pattern.compile("\\b[a-z]{3}\\b");
//通过模式对象得到匹配器对象
Matcher m = p.matcher(s);
/* //调用匹配器对象的功能
//通过find方法查找有没有满足条件的子串
//public boolean find()
boolean flay = m.find();
//如何得到值呢?
//public String group();
String ss = m.group();
System.out.println(ss);
//再来一次
//flag = m.find();
ss=m.group();
System.out.println(ss);
*/
while(m.find()){
System.out.println(m.group()); //调用group之前一定要find先找,找到才能group
}
}
}