目的:校验-----处理文本和匹配模式
语法:
1 常用元字符(特殊含义)
1)"\"----将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。
2)"\t"---制表符 ('\u0009')
3)"\r"---回车符 ('\u000D')
4)"\n"---换行符 ('\u000A') 注意:IO流中要写入换行符号:windows "\r\n"
预定义字符类:
5)"\d"---匹配一位数字--等价[0-9],\d在正则表达式应用的时候:[0-9]--->\\d
6)"."-----任何字符
7)"\w"--单词字符(字母、数字、下划线)等价于[a-zA-Z_0-9],而javascript中[a-zA-Z0-9]
8)"\s"--匹配任意空的(空格,制表。换行,中文全角空格)
注意:字母大写(表示非)
数量限定符:
9)"+"----代表的是数字({1,n}),匹配前面的子表达式---(至少一次)
10)"*"----代表的是数字({0,n}),匹配前面的子表达式---任意次
11)"?"----代表的是数字({0,1}),匹配前面的子表达式(理解层面"?"就是问有没有)
边界匹配器:
12)"^"-- 匹配输入字符串的开始位置
13)"$"---匹配输入字符串的结束位置。
14)"\b"--匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的);例如---“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”
注意:对于部分元字符(无\),如果要使用其本身,必须在其前面加"\\"将其特殊含义注释掉,方能释放自我(原因:\本身也是元字符)
"[]"含义:匹配多个字符的一个
深究"[]":[abc]------a、b 、 c中的一个
[^abc]-----除了 a、b 、c的任何字符(否定)
[a-z]-------在a-z之间的任意字符
[a-d[m-p]] a 到 d 或 m 到 p---等价[a-dm-p](并集)
[a-z&&[def]] d、e 或 f (交集)
[a-z[^a]] 小写字母a的补集------------------------(补集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z] (减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
"{}"含义:匹配指定数目的字符,这些字符是在它之前的表达式定义的
X{n}X,恰好 n 次
X{n,}X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
注意:只有连字符("-")在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身。
应用场景:
一个或多个汉字----------------------^[\u0391-\uFFE5]+$
邮政编码----------------------------^[1-9]\d{5}$
QQ号码-----------------------------^[1-9]\d{4,10}$
邮箱--------------------------------^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$
用户名(字母开头 + 数字/字母/下划线)--- ^[A-Za-z][A-Za-z1-9_-]+$
手机号码----------------------------^1[3|4|5|8][0-9]\d{8}$
URL--------------------------------^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
18位身份证-------------------------^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$
String类中的三个基本操作(使用正则):
1--匹配:matches()
2--切割: split()
3--替换: replaceAll()
1----public booleanmatches(String regex)
说明:告知此字符串是否匹配给定的正则表达式
形参:正则表达式字符串形式
返回值类型:boolean(是否匹配)
实例1 传统做法
package org.westos.regex;
import java.util.Scanner;
/**
* 需求:校验一个QQ号码
* 定义一个规则:1)由5到10为组成的数字
* 2)不能以0开头
* 分析:
* 1)键盘录入一个QQ号码,使用字符串接收
* 2)定义一个校验QQ的功能
* 3)在main()中调用返回boolean类型
* @author Orange
*/
public class RegexDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//录入并接收数据
System.out.println("请您输入一个QQ号码:");
String QQ = sc.nextLine() ;
//写一个校验QQ的功能
boolean flag = checkQQ(QQ) ;
System.out.println("flag:"+flag);
}
/**
* 两个明确:
* 明确返回值类型:boolean类型
* 参数类型:String 输入的qq号码
*/
public static boolean checkQQ(String qq){
//假设定义个标记
boolean flag = true ;
//需要判断:qq:长度5-10
if(qq.length()>=5 && qq.length()<=10){
//符合这个规则
//符合第一个规则还要符合不能以0开头
if(!qq.startsWith("0")){
//符合这个规则
//这些QQ号码必须还数字的
//可以先将qq,转换成字符数字
char[] chs = qq.toCharArray() ;
//遍历字符数组,获取每一个字符
for(int x = 0 ; x < chs.length ; x ++){
char ch = chs[x] ;
//获取到每一个字符,判断该字符是否是数字
if(!Character.isDigit(ch)){
flag = false ;
break ;
}
}
}else{
flag = false ;
}
}else{
flag = false ;
}
return flag ;
}
}
实例2 使用String类的matchs()方法进行匹配
package org.westos.regex;
import java.util.Scanner;
/**
* 需求:校验一个QQ号码
* 定义一个规则:1)由5到10为组成的数字
* 2)不能以0开头
* 分析:
* 1)键盘录入一个QQ号码,使用字符串接收
* 2)定义一个校验QQ的功能
* 3)在main()中调用返回boolean类型
* @author Orange
*/
public class RegexDemo2 {
public static void main(String[] args) {
//创建键盘了录入对象
Scanner sc = new Scanner(System.in) ;
//录入并接收数据
System.out.println("请您输入QQ号码: ");
String QQ = sc.nextLine() ;
String regex = "[1-9][0-9]{4,9}";//正则表达式(字符串形式)
/* 说明1:
* public boolean matches(String regex)
* 说明:告知此字符串是否匹配给定的正则表达式
* 形参:正则表达式字符串形式
* 返回值类型:boolean(是否匹配)
* */
boolean isBoolean=QQ.matches(regex);
System.out.println(isBoolean);
/*
* 说明2:
* 自己封装写一个方法
* */
boolean flag = checkQQ(QQ) ;
System.out.println("flag: "+flag);
}
public static boolean checkQQ(String qq){
/*
* 分步骤:
* String regex = "[1-9][0-9]{4,9}" ;
* boolean flag = qq.matches(regex) ;
* return flag ;
*
**/
//直接返回(一步走)
return qq.matches("[1-9]\\d{4,9}");
}
}
练习1
package org.westos.regex_01;
import java.util.Scanner;
/**
* 需求:校验邮箱:
* QQ邮箱:
* [email protected]
* [email protected]
* [email protected]
* [email protected]
* [email protected]
* [email protected]....
* 分析: 1)键盘录入邮箱
* 2)定义正则规则
* 3)使用String中的特有功能校验
* 4)输出即可
* @author Orange
*/
public class RegexTest {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//录入并接收
System.out.println("请您输入一个邮箱:");
String email = sc.nextLine() ;
//定义正则规则:本身就是.-->\.--->\\.
String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z]{2,3})+" ;
//校验
boolean flag = email.matches(regex) ;
System.out.println("flag:"+flag);
}
}
2-----public String[]split(String regex)
功能:根据给定正则表达式的匹配拆分此字符串(分割功能)
形参:正则表达式(字符串)
返回值类型:String[]
语法格式:要判断的字符串引用.split(正则表达式引用)
实例3
package org.westos.regex_02;
import java.util.Scanner;
/**
* String的分割功能:
* 应用场景:(搜索)
* QQ,搜索好友,相亲网:世纪佳缘...
* 女 "18-24"
* String ages = "18-24" ;
* @author Orange
*/
public class RegexDemo {
public static void main(String[] args) {
//定义一个字符串
String ages = "18-24" ;
//定义正则规则
String regex = "-" ;
//public String[] split(String regex)
String[] strArray = ages.split(regex) ;
//如何得到当前字符串数组中的元素(字符)(转换int类型的数据)
int startAge = Integer.parseInt(strArray[0]) ;
int endAge = Integer.parseInt(strArray[1]) ;
//键盘录入一个年龄,属于int类型的数据
//创建键盘录入对象
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("不是我们要找的...");
}
}
}
实例4
package org.westos.regex_02;
/**
* 分割功能的应用:
* @author Apple
*/
public class RegexDemo2 {
public static void main(String[] args) {
//定义个字符串
String str1 = "aa,bb,cc" ;
//使用分割功能
String[] strArray1 = str1.split(",") ;
//遍历字符串数组
for(int x = 0 ; x < strArray1.length; x ++){
System.out.println(strArray1[x]);
}
System.out.println("------------------");
//字符串:
String str2 = "aa bb cc" ;
//使用切割功能:
String[] strArray2 = str2.split(" +") ;
for(int x = 0 ; x
3----String类中的替换功能
public StringreplaceAll(String regex,String replacement)
功能:使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串,满足此正则形式则用replacement替换
形参:参数1(正则表达式)、参数2(代替的字符串)
返回值类型:String(被和谐掉的字符串)
语法格式:原字符串引用.replaceAll(正则表达式引用,代替的引用)
实例5
package org.westos.regex_02;
//需求:让当前这个字符串中的数字不显示出来(和谐)
public class RegexDemo3 {
public static void main(String[] args) {
//定义一个字符串:
String str = "helloword123JavaSE45678Javaweb" ;
//定义当前大串中数字定义正则规则 ;
String regex = "\\d+" ;//贪婪匹配(正则表达式字符串)
String s = "*" ; //目标(目标字符串)
String result = str.replaceAll(regex, s) ;
System.out.println("result:"+result);
}
}
regex包下的Pattern类和Matcher类(很少用),相关链接:点击打开链接
实例6
package org.westos.regex_02;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 关于模式和匹配器的使用:获取功能
* 模式和匹配器基本使用顺序
* @author Orange
*/
public class RegexDemo4 {
public static void main(String[] args) {
//public static Pattern compile(String regex)将给定的正则表达式编译成一个模式对象
//1)获取模式对象(通过正则规则)
Pattern p = Pattern.compile("a*b") ;
//2)通过模式获取匹配器对象,(将一个字符串类型的数据)
Matcher m = p.matcher("aaaaaab") ;
//3)调用Match(匹配器类)中的:public boolean matches():判断当前用户录入的字符串是否和当前的正则规则匹配
boolean flag = m.matches() ;
System.out.println("flag:"+flag);
System.out.println("----------------------------");
//上述写法非常麻烦,要获取模式对象Pattern还要获取匹配器对象:Matcher,然后通过matches()方法返回一个结果
//以后可以使用下面这种格式
//定义一个正则规则
String regex = "a*b" ;
//指定某一个字符串
String str = "aaaaaaab" ;
//使用String类的功能
//使用当前给定的字符串调用public boolean matchers(String regex)
boolean flag2 = str.matches(regex) ;
System.out.println("flag2: "+flag2);
}
}
练习2
package org.westos.regex_02;
import java.util.Arrays;
/**
* 我有如下一个字符串:"91 27 46 38 50"
请写代码实现最终输出结果是:"27 38 46 50 91"
分析:
1)定义这个字符串
2)使用分割功能分割成一个字符串数组
3)如何得到一个int类型数组:动态初始化定义int数组 int[] arr = new int[字符串数数组.length] ;
4)遍历int数组
获取每一个元素:arr[x] = Integer.parseInt(字符串数组对象[x])
5)排序:Arrays数组工具类型快速排序:sort(arr)
6)再去遍历int类型数组获取每一个元素,用字符串缓冲区来进行拼接
7)输出字符串
* @author Apple
*/
public class RegexTest {
public static void main(String[] args) {
//定义一个字符串
String str = "91 27 46 38 50" ;
//使用分割功能
String[] strArray = str.split(" ") ;
//定义一个int类型的数组,动态初始化
int[] arr = new int[strArray.length] ;
//遍历int类型的数组
for(int x = 0 ; x < arr.length ; x ++){
arr[x] = Integer.parseInt(strArray[x]) ;
} //parseInt()方法将数字字符串变成int型(将字符串参数作为有符号的十进制整数进行解析),很重要!!!
//使用Arrays数组工具类型进行操作(sort:快速排序)
Arrays.sort(arr) ;
//创建StringBuilder缓冲区对象
StringBuilder sb = new StringBuilder() ;
//再去遍历int类型的数组,目的使用为了拼接(append)
for(int x = 0 ; x < arr.length ; x ++){
//使用追加功能
sb.append(arr[x]).append(" ") ;
}
//要将字符串缓冲转换成String类型,并且去除两端空格
String result = sb.toString().trim() ;
System.out.println("result:"+result);
}
}
相关链接:1---点击打开链接
2---点击打开链接
3---点击打开链接
4---点击打开链接---知乎
5---点击打开链接---汇总