正则表达式(2)
正则表达式三个常用类
Pattern类
matches(regStr,context):用于整体匹配,在验证输入的字符串是否满足条件时使用(返回值为boolean型)
Matcher类
反向引用
案例引入
给定一段文本,找出所有四个数字连在一起的子串,并且这四个数字满足:1.第一位与第四位相同,2.第二位与第三位相同。如:1221,5775……
案例:结巴去重
把:”我…我要…学学学…编程java!“ 通过正则表达式 修改成 ”我要学编程java!“
解题思路:
- 去掉所有的.;
- 去重
2.1 使用反向引用 \1找到重复:(.)\1+ 【.为任意一个字符,\1 为反向引用】
2.2 使用反向引用 $1 来替换匹配到的内容
context = Pattern.compile("(.)\\1+").matcher(context).replaceAll("$1")
代码
public static void main(String[] args) {
String context = "我...我要......学学学...编程java!";
//去掉所有的.
Pattern pattern = Pattern.compile("\\.");
Matcher matcher = pattern.matcher(context);
context = matcher.replaceAll("");
//去重
// //1.找到重复
// pattern = Pattern.compile("(.)\\1+");//分组的捕获内容记录到$1
// matcher = pattern.matcher(context);
// //2.替换
// context = matcher.replaceAll("$1");
// System.out.println(context);
//一条语句来去重
context = Pattern.compile("(.)\\1+").matcher(context).replaceAll("$1");
}
String类中使用正则表达式
替换功能 - replaceAll
public String replaceAll(String regex, String replacement)
注意:正则匹配符中一定不要有空格!
代码
public static void main(String[] args) {
String content = "jdk1.3与jdk1.4有什么比较重要的区别啊?如果要把系统的运行环境从jdk1.3"
+ "升级到jdk1.4,有哪些值得注意的事项?例如:原来某个类的方法在新版本中不建议使用的,"
+ "或者某些类被更新的类替换掉的";
content = content.replaceAll("jdk1\\.3|jdk1\\.4", "jdk");
System.out.println(content);
}
判断功能 - matches(返回值为boolean型)
public String matches(String regex)
验证一个手机号必须是以138 139开头的
public static void main(String[] args) {
String content = "13811111111";
if(content.matches("13(8|9)\\d{8}")){
System.out.println("验证成功");
}else{
System.out.println("验证失败");
}
}
分割功能 - split
public String[ ] split(String regex)
返回的是一个字符串数组,for each遍历输出
String content = “hello#abc-jack12smith~北京”
要求按照#或者-或者~或者数字来分割
public static void main(String[] args) {
String content = "hello#abc-jack12smith~北京";
String[] split = content.split("#|-|~|\\d+");
for (String s : split){
System.out.println(s);
}
}