Java中的正则表达式
Java中提供了对正则表达式的支持。String类提供了一个matches方法来进行简单的字符串正则匹配,也有专门的Pattern类和Matcher类来提供更加强大的正则支持。
1、String类的matches方法
api中的描述:
测试:
public static void main(String[] args) {
// 腾讯的邮箱格式
// 首字符不能为0,qq号长度6到11位且为纯数字,以@qq.com结尾
String regex = "[1-9][\\d]{5,10}@qq\\.com{1}$";
String email0 = "2321422@163.com";
String email2 = "123122saa@163.cn";
String email3 = "1069316276@qq.com";
String email4 = "1824367412@qq.com@qq.com";
String email5 = "43544@qq.com";
// matches方法匹配正则
System.out.println("2321422@163.com是否为腾讯邮箱?" + email0.matches(regex));
System.out.println("123122saa@163.cn是否为腾讯邮箱?" + email2.matches(regex));
System.out.println("1069316276@qq.com是否为腾讯邮箱?" + email3.matches(regex));
System.out.println("1824367412@qq.com@qq.com是否为腾讯邮箱?" + email4.matches(regex));
System.out.println("43544@qq.com是否为腾讯邮箱?" + email5.matches(regex));
}
该方法较为简单,传一个正则表达式参数就行了,需要注意的是Java中转义字符的写法和正则中的略不同,要加两条\而不是一条\。
2、Pattern类
java.util.regex.Pattern类没有公共构造方法。要创建一个Pattern对象,只能调用其公共静态方法compile,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。
java.util.regex.Pattern类的api说明:
该类提供的方法:
标记的是使用的较多的方法。
java.util.regex.Pattern类的部分源码:
它是一个final修饰的最终类,并且已经序列化了。
compile方法用于返回Pattern实例。
matcher方法返回Matcher实例。
3、Matcher类
java.util.regex.Matcher类也没有公共构造方法,需要调用Pattern对象的matcher方法来获得一个Matcher对象。
api说明:
提供的方法:
标记的方法是用的多一点的。
java.util.regex.Matcher类的部分源码:
此类也是最终类,并且实现了一个MatchResult接口。
4、测试
通过代码测试常用的一些方法。
public static void main(String[] args) {
// 任意一个正整数的正则
String regex = "[1-9]\\d*";
// compile静态方法获取Pattern对象
Pattern pattern = Pattern.compile(regex);
// 由Pattern对象获取Matcher对象
Matcher matcher = pattern.matcher("25");
// matches方法测试是否匹配
boolean res = matcher.matches();
System.out.println("25是一个正整数吗?" + res);
System.out.println("-25是一个正整数吗?" + pattern.matcher("-25").matches());
System.out.println("0是一个正整数吗?" + pattern.matcher("0").matches());
// matches静态方法更加简便
boolean res2 = Pattern.matches(regex, "100");
System.out.println("100是一个正整数吗?" + res2);
}
public static void main(String[] args) {
String word = "I have writen 100 songs!";
// 这个正则需要进行捕获
String regex = "(\\D*)(\\d+)(\\D*)";
// 获取Pattern对象
Pattern p = Pattern.compile(regex);
// 获取Matcher对象
Matcher m = p.matcher(word);
// find方法判断匹配模式是否有下一个子序列
if(m.find()) {
// group方法返回捕获的子序列
System.out.println("捕获的值:" + m.group(0));
System.out.println("捕获的值:" + m.group(1));
System.out.println("捕获的值:" + m.group(2));
System.out.println("捕获的值:" + m.group(3));
} else {
System.out.println("无任何捕获值!");
}
}
public static void main(String[] args) {
String word = "you are too young,you have no money,and you him mother!";
// 统计单词you出现的次数
String regex = "\\byou\\b";
int count = 0;
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(word);
while(m.find()) {
count++;
// start方法返回匹配项的开始索引,end方法返回结束索引
System.out.println("起始位置" + m.start() + "结束位置" + m.end() + ",出现第" + count + "次");
}
}
public static void main(String[] args) {
// 测试matches方法和lookingAt方法
String res = "kawayiyiyiyi";
String regex = "kaway";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(res);
// matches方法是全部匹配
System.out.println("是否全部匹配正则?" + m.matches());
// lookingAt方法是包含正则就行了,但必须从第一个字符开始
System.out.println("是否匹配?" + m.lookingAt());
String res2 = "you are single,and you are dog,and you have no money!";
// 匹配的正则
String regex2 = "you";
// 替换的内容
String rep = "你";
Pattern p2 = Pattern.compile(regex2);
Matcher m2 = p2.matcher(res2);
// replaceFirst方法替换第一个
System.out.println("替换后的内容:" + m2.replaceFirst(rep));
// replaceAll方法是替换全部
System.out.println("替换后的内容:" + m2.replaceAll(rep));
String res3 = "ycz132173gas1212hd112g1d1k21ycz";
String regex3 = "\\d{1,}";
String and = "+";
StringBuffer sb = new StringBuffer("");
Pattern p3 = Pattern.compile(regex3);
Matcher m3 = p3.matcher(res3);
while(m3.find()) {
// appendReplacement方法需要两个参数,第一个是StringBuiler类型,第二个是要替换成的内容
// 这个方法会将原串中匹配的内容替换掉
// 并且将替换后的新串(只在替换位置之间的内容,最后一次替换位置之后的内容不会追加)追加到StringBuilder对象中
m3.appendReplacement(sb, and);
}
System.out.println("原串:" + res3);
System.out.println("替换后的内容:" + sb.toString());
// appendTail方法会将最后一次替换内容之后的所有内容追加到StringBuilder对象中
// 因此得出一个结论
//appendReplacement方法 + appendTail方法可以起到替换所有的效果,相当于replaceAll方法
m3.appendTail(sb);
System.out.println("替换后的内容:" + sb.toString());
}