1、正则概述
1.1、什么是正则表达式
正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
1.2、String类匹配正则
String类中,使用正则表达式匹配完整字符串的方法为:
public boolean matches(String regex) 调用方法的字符串为被规则匹配的字符串
regex字符串(正则字符串)为匹配规则
返回值为布尔型,符合规则返回true,不符合返回false
我们简单了解了匹配规则,这里给出手机号与邮箱的匹配规则:
邮箱规则:String regex = ”\w @\w{2,7}\.\w{2,3}”; 手机号规则:String regex = ”[1][3,4,5,7,8][0-9]{9}”; 如:
代码语言:javascript复制public class RegexDemo01 {
public static void main(String[] args) {
String data = "aaa@163.com";
//返回结果为true
boolean result = data.matches("\w @\w{2,7}\.\w{2,3}");
System.out.println(result);
String data2 = "itheima.cn";
//返回结果为false
boolean result2 = data2.matches("\w @\w{2,7}\.\w{2,3}");
System.out.println(result2);
}
}
运行结果:
案例:
需求:判断一个字符串 (1)长度大于等于5小于等于15 (2)数字开头 不包含0
正则表达式:"[1-9].{4,14}"
代码语言:javascript复制import java.util.Scanner;
public class RegexDemo02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
boolean flag = check(s);
boolean flag2 = check2(s);
System.out.println(flag);
System.out.println(flag2);
}
public static boolean check2(String s) {
// String regex="[1-9].{4,14}";
// boolean b = s.matches(regex);
// return b ;
return s.matches("[1-9].{4,14}");
}
public static boolean check(String s) {
boolean flag = true;
//判断长度
if (s.length() >= 5 && s.length() <= 15) {
char c = s.charAt(0);
//判断数字开头 不包含0
if (!(c >= '1' && c <= '9')) {
flag = false;
}
} else {
flag = false;
}
return flag;
}
}
运行结果:
1.3、字符串涉及正则常用方法
public String[] split(String regex) //将符合规则的字符串作为切割符切割
public String replaceAll(String regex,String replacement) //将符合规则的字符串替换为新字符串
代码语言:javascript复制public class RegexDemo03 {
public static void main(String[] args) {
String girlName = "姗姗.慧慧.柳柳.莲莲.糖糖 ";
String[] girlNames = girlName.split("\.");
// System.out.println(girlNames[0]);
// System.out.println(girlNames[1]);
// System.out.println(girlNames[2]);
// System.out.println(girlNames[3]);
// System.out.println(girlNames[4]);
for (int i = 0; i < girlNames.length; i ) {
String string = girlNames[i];
System.out.println(string);
}
String replaceAll = girlName.replaceAll("柳", "岩岩");
System.out.println(replaceAll);
}
}
运行结果:
2、Pattern类
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher
2.1、Pattern类对象创建
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式
代码语言:javascript复制import java.util.regex.Pattern;
public class RegexDemo04 {
public static void main(String[] args) {
Pattern p = Pattern.compile("java*");
System.out.println(p.pattern());// 返回java* ,返回的既是正则字符串.
}
}
pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数
2.2、Pattern常用方法
split(CharSequence input)方法,用于分隔字符串,并返回一个String[]
代码语言:javascript复制import java.util.regex.Pattern;
public class RegexDemo05 {
public static void main(String[] args) {
Pattern p =Pattern.compile("\d ");//"\d "表示一个或多个数字
String[] str=p.split("a 11123 player 2234 or 345 nothing");
for(int i=0;i<str.length;i ){
System.out.println(str[i]);
}
}
}
运行结果:
Pattern.matches(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.
代码语言:javascript复制import java.util.regex.Pattern;
public class RegexDemo06 {
public static void main(String[] args) {
boolean b1=Pattern.matches("\d ","2223");//返回true
boolean b2=Pattern.matches("\d ","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到
boolean b3=Pattern.matches("\d ","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
}
}
运行结果:
3、Matcher类
Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。
3.1、Matcher类对象创建
Matcher类构造方法也是私有的,不能直接创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例
代码语言:javascript复制import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo07{
public static void main(String[] args) {
Pattern p = Pattern.compile("\d ");
Matcher m = p.matcher("22bb23");
System.out.println(m.pattern());// 返回d
}
}
运行结果:
3.2、Matcher类常用方法
matches():对 整个字符串进行匹配,只有整个字符串都匹配了才返回true
代码语言:javascript复制import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo08 {
public static void main(String[] args) {
Pattern pm = Pattern.compile("\d ");
Matcher mm = pm.matcher("1111a");
System.out.println(mm.matches());// 因为a不能被d 匹配,返回false
Matcher mm2 = pm.matcher("1111");
System.out.println(mm2.matches());// 返回true,因为d 匹配到了整个字符串
}
}
运行结果:
lookingAt():对前面的字符串进行匹配,只有在最前面匹配到才返回true
代码语言:javascript复制import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo09 {
public static void main(String[] args) {
Pattern pl = Pattern.compile("\d ");
Matcher ml = pl.matcher("1111a");
System.out.println(ml.lookingAt());// 返回true,因为d 匹配到了前面的1
Matcher ml2 = pl.matcher("a1111");
System.out.println(ml2.lookingAt());// 返回false,因为d 不能匹配前面的a
}
}
运行结果:
find():对字符串进行匹配,匹配到的字符串可以在任何位置.
代码语言:javascript复制import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo10 {
public static void main(String[] args) {
Pattern pf = Pattern.compile("\d ");
Matcher mf = pf.matcher("1111a");
System.out.println(mf.find());// 返回true
Matcher mf2 = pf.matcher("aaaa");
System.out.println(mf2.find());// 返回false
}
}
运行结果:
当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息. start()返回匹配到的子字符串在字符串中的索引位置. end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置. group()返回匹配到的子字符串
代码语言:javascript复制import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo11{
public static void main(String[] args) {
Pattern p=Pattern.compile("\d ");
Matcher m=p.matcher("aaa2223bb");
System.out.println(m.find());//匹配2223
System.out.println(m.start());//返回3
System.out.println(m.end());//返回7,返回的是2223后的索引号
System.out.println(m.group());//返回2223
}
}
运行结果: