正则表达式概念
简单理解:符合一定规则的字符串。
常用的正则表达式规则
此处只是介绍了几种常见的类型,还有其他类型,都在Pattern类的API中有,需要其他的直接查询API。
有如下几种类型:
A:字符
x 字符 x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
C:预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是非单词字符的地方。
举例:hello world?haha;xixi
E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次正则表达式的应用
A:判断功能
String类的public boolean matches(String regex)
使用该方法检测QQ号码输入是否正确?判断邮箱号码是否正确?
此处的例程仅仅用于测试方法,并不一定是很完美的代码。
例程1:检查QQ号码
package com.chechQQ.test;
import java.util.Scanner;
/** 检查输入QQ号码是否符合标准* 1.必须是5-15位的数字* 2.不能以0开头*/
public class CheckQQ {
public static void main(String[] args) {
//创建一个键盘录入对象Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.nextLine();
System.out.println("检查是否合格:" + checkQQ(qq));
System.out.println("正则检查是否合格:" + checkQQByRegex(qq));
}
/** 创建一个检测方法* 返回值类型:boolean* 参数列表:String qq*/
public static boolean checkQQ(String qq)
{
boolean flag = true;
//检查是否长度合格if((qq.length() >= 5) && (qq.length() <= 15))
{
//判断是否以0开头if(!qq.startsWith("0"))
{
//判断内容是否都为数字char[] charr = qq.toCharArray();
for (char c : charr) {
if(!Character.isDigit(c))
{
flag = false;
break;
}
}
}
else
{
flag = false;
}
}
else
{
flag = false;
}
return flag;
}
/** 创建一个检测方法* 返回值类型:boolean* 参数列表:String qq*/
public static boolean checkQQByRegex(String qq)
{
//boolean flag = true;//String regex = "[1-9][0-9]{4,14}";//flag = qq.matches(regex);//return flag;
return qq.matches("[1-9][0-9]{4,14}");
}
}
例程2:检查邮箱
package com.chechQQ.test;
import java.util.Scanner;
/** 需求:判断一个字符串是否满足邮箱的格式** 分析:* 1.创建键盘录入对象,输入邮箱字符串* 2.编写正则表达式规则* 3.调用规则进行判断* 4.打印判断结果**/
public class CheckMailTest {
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]{2,6}(\\.[a-zA-Z_0-9]{2,5})+";
//调用规则进行判断boolean flag = mail.matches(mailRegex);
//打印判断结果System.out.println(mail + "是否是邮箱:" + flag);
}
}
B:分割功能
String类的public String[] split(String regex)
分割功能实际上就是按照指定的字符来将长的字符串切片,分成一小块一小块的单元。
此处也将给出两个测试例程,仅仅作为测试方法的例程。
例程1:测试年龄段是否符合要求
package com.chechQQ.test;
import java.util.Scanner;
/** 很多网站中查询好友或者查询其他人,可以输入查询条件* 此处以年龄查询作为例子* 年龄:18-24** 如何在后台获取到18和24这两个数据**/
public class SplitAges {
public static void main(String[] args) {
//定义一个年龄范围String ages = "18-24";
//定义规则String regex = "-";
//分割字符串,得到数据String[] strArr = ages.split(regex);
遍历数据//for (String string : strArr) {//System.out.println(string);//}
//拿到开始年纪和结束年龄int startAge = Integer.parseInt(strArr[0]);
int endAge = Integer.parseInt(strArr[1]);
//键盘输入年龄Scanner sc = new Scanner(System.in);
System.out.println("输入年龄:");
int myAge = sc.nextInt();
//判断年龄是否符合if(myAge >= startAge && myAge <= endAge)
{
System.out.println("你就是我要找的人");
}
else
{
System.out.println("不符合要求,滚");
}
}
}
例程2:对分割功能的多方面测试
package com.chechQQ.test;
/** 分割功能应用*/
public class SplitTest {
public static void main(String[] args) {
//目标字符串String s1 = "aa,bb,cc";
//直接分割字符串String[] s1Arr = s1.split(",");
//遍历for (String string : s1Arr) {
System.out.println(string);
}
System.out.println("-----------------------");
//目标字符串String s2 = "aa.bb.cc";
//直接分割字符串//String[] s2Arr = s2.split("."); //错误版,字符"."在正则表达式中表示任意字符,所以将所有都分割了,打印出来空白String[] s2Arr = s2.split("\\.");
//遍历for (String string : s2Arr) {
System.out.println(string);
}
System.out.println("-----------------------");
//目标字符串String s3 = "aa bb cc";
//直接分割字符串String[] s3Arr = s3.split(" +"); //表示一个或多个空格
//遍历for (String string : s3Arr) {
System.out.println(string);
}
System.out.println("-----------------------");
//目标字符串//此处使用文件路径作为字符串,必须使用\\表示一个\String s4 = "D:\\JAVA learning\\Split";
//直接分割字符串//String[] s4Arr = s4.split("\\"); //错误版 将会报异常String[] s4Arr = s4.split("\\\\"); //正则表达式中\\代表一个\,\\\\才能代表\\
//遍历for (String string : s4Arr) {
System.out.println(string);
}
System.out.println("-----------------------");
}
}
C:替换功能
String类的public String replaceAll(String regex,String replacement)
替换功能挺常见的,比如我们的QQ中发送一些非法的字符,如银行卡号等,就会被QQ给拦截。此例程也就实现了类似功能:
package com.replace.test;
/** 替换功能*/
public class ReplaceBadnum {
public static void main(String[] args) {
//源字符串String str = "hello qq23424 world kh6212133 java";
//替换规则替换后只留下一颗*//String regex = "\\d+";//String replacStr = "*";//result:hello qq* world kh* java
使用每一颗*替换每一个字符//String regex = "\\d";//String replacStr = "*";//result:hello qq***** world kh******* java
//直接剔除掉数字String regex = "\\d";
String replacStr = "";
//result:hello qq world kh java
//进行替换String result = str.replaceAll(regex, replacStr);
//打印输出System.out.println("result:" + result);
}
}
D:获取功能
Pattern和Matcher
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
find():查找存不存在
group():获取刚才查找过的数据
前面的三个功能都是可以使用String类的方法完成,而且使用String类的方法挺简单了,但是第四个功能就使用Pattern类和Matcher类,Pattern类用来编译我们写的正则表达式,将去转化为一个Pattern对象,使用Pattern对象的方法则可以获取Matcher类匹配器的对象,这两步是必须的。当有了匹配器对象时,可以使用其中的方法处理字符串了。
两个例程如下,一个完成了判断功能,一个完成的是获取功能。
例程1:判断功能
package com.getFun.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** 典型的调用顺序是** Pattern p = Pattern.compile("a*b");* Matcher m = p.matcher("aaaaab");* boolean b = m.matches();*/
public class PatternTest {
public static void main(String[] args) {
//典型调用顺序//使用Pattern的compile()方法来编译正则表达式得到Pattern对象Pattern p = Pattern.compile("a*b");
//使用Pattern对象的matcher()方法得到匹配器对象,需要传入参数是被比较字符串Matcher m = p.matcher("aaaaab");
//调用匹配器方法,得到匹配结果boolean b = m.matches();
System.out.println(b);
//在判断功能中使用太过于麻烦了,推荐还是使用字符串中的字符串匹配方法//字符串判断功能String str = "aaaaab";
//正则表达式String regex = "a*b";
//使用字符串判断功能boolean result = str.matches(regex);
System.out.println(result);
}
}
例程2:获取功能
package com.getFun.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** 从字符串"da jia ting wo shuo,jin tian yao xia yu,wan shang bu shang ke,gao xin bu?"* 中找出三个字符构成的词,然后输出*/
public class GetSubString {
public static void main(String[] args) {
//源字符串String str = "da jia ting wo shuo,jin tian yao xia yu,wan shang bu shang ke,gao xing bu?";
//规则//修改前的规则//String regex = "\\w{3}";//上一个规则存在漏洞,只要是3个字符都正确//应该限制字符串前后都字符分界符String regex = "\\b\\w{3}\\b";
//将规则编译后的到Pattern对象Pattern p = Pattern.compile(regex);
//使用Pattern方法得到匹配器对象Matcher m = p.matcher(str);
//使用匹配器中的方法获取字符串使用find方法来查询是否匹配//boolean flag = m.find();//System.out.println(flag); //true使用group方法来获取子串//String subStr = m.group();//System.out.println(subStr); //jia多获取几次//flag = m.find();//System.out.println(flag); //true//subStr = m.group();//System.out.println(subStr); //tin 此处得到的结果不正确检查上面的使用方法,只有目标字符串和规则是自己写的,其他都是写好直接调用的那么可能是规则出错了
//使用循环处理整个字符串while(m.find())
{
System.out.println(m.group());
}
}
}