1. 提出要求 896
请看下面问题:
给你一段文本请你找出所有四个数字连在一 起的子串,并且这四个数字要满足①第1位与第4位相同②第2位与第3位相同,比如1221,5775,……
2. 介绍 896
要解决前面的问题,我们需要了解正则表达式的几个概念:
1. 分组
我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式/一 个分组。
2.捕获
把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用,从左向右, 以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则式
3.反向引用
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用 \\分组号,外部反向引用$分组号
3. 看几个小案例 897
1.要匹配两个连续的相同数字: (\\d)\\1
2.要匹配五个连续的相同数字: (\\d)\\1{4}
3.要匹配个位与干位相同,十位与百位相同的数5225, 1551 (\\d)(\\d)\\2\\1
4.思考题
请在字符串中检索商品编号,形式如:12321-333999111这样的号码,要求满足前面是一个五位数,然后一 个-号,然后是一个九位数,连续的每三位要相同
代码在com.stulzl.regexp14
Regexp14
package com.stulzl.regexp14;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//反向引用 897
public class Regexp14 {
public static void main(String[] args) {
String content = "h1234el9876lo33333 j12321-333999111a1551ck tom11 jack22 yyy12345 xxx";
//1.要匹配两个连续的相同数字: (\\d)\\1
//String regStr = "(\\d)\\1";
//2.要匹配五个连续的相同数字: (\\d)\\1{4}
//String regStr = "(\\d)\\1{4}";
//3.要匹配个位与干位相同,十位与百位相同的数5225, 1551 (\\d)(\\d)\\2\\1
//String regStr = "(\\d)(\\d)\\2\\1";
//请在字符串中检索商品编号,形式如:12321-333999111这样的号码,要求满足前面是一个五位数
// ,然后一 个-号,然后是一个九位数,连续的每三位要相同
String regStr = "\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
System.out.println("找到 "+matcher.group(0));
}
}
}
4. 经典结巴程序 898
把类似 : "我....我要....学学学学....编程 java!";
通过正则表达式 修改成 "我要学编程 java"
代码在 com.stulzl.regexp15
Regexp15
package com.stulzl.regexp15;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//经典结巴程序 898
public class Regexp15 {
public static void main(String[] args) {
//把类似 : "我....我要....学学学学....编程 java!";
//通过正则表达式 修改成 "我要学编程 java"
String content = "我....我要....学学学学....编程 java!";
//1 把所有的.都去掉
Pattern pattern = Pattern.compile("\\.");
Matcher matcher = pattern.matcher(content);
content = matcher.replaceAll("");
// System.out.println("content="+content);
//2 去掉重复的字 我我要学学学学编程 java!
// 思路
//(1) 使用 (.)\\1+ 解释:.可以代表除了\n的所有字符,然后反向引用即\\1
// (这里反向引用一次,就是有两个一样的了例如:我我)后面的+则代表反向引用可以有好多次
//(2) 使用 反向引用$1 来替换匹配到的内容
// 注意:因为正则表达式变化,所以需要重置 matcher
// pattern = Pattern.compile("(.)\\1+");//分组的捕获内容记录到$1
// matcher = pattern.matcher(content);
// while(matcher.find()){
// System.out.println("找到="+matcher.group(0));
// }
// //使用 反向引用$1 来替换匹配到的内容
// //解释:因为之前的(.)是分组捕获,就会捕获 我 和 学 两个字,
// // 然后(.)\\1+查到的 我我 学学学学,就会被$1外部反向引用的 我 学 二字替换
// content = matcher.replaceAll("$1");
// System.out.println("content="+content);
//3 使用一条语句来解决去掉重复汉字的问题 我我要学学学学编程 java!
content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
System.out.println("comtent="+content);
}
}
5. String 类中使用正则表达式 899
5.1 替换功能
String 类 public String replaceAll(String regex,String replacement)
5.2 判断功能
String 类 public boolean matches(String regex){} //使用 Pattern 和 Matcher 类
5.3 分割功能
String 类 public String[] split(String regex)
5.1 5.2 5.3代码在com.stulzl.regexp_string 899
StringRegexp
package com.stulzl.regexp_string;
//String 类中使用正则表达式 899
public class StringRegexp {
public static void main(String[] args) {
String content = "2000 年 5 月,JDK1.3、JDK1.4 和 J2SE1.3 相继发布,几周后其" +
"获得了 Apple 公司 Mac OS X 的工业标准的支持。2001 年 9 月 24 日,J2EE1.3 发" +
"布。2002 年 2 月 26 日,J2SE1.4 发布。自此 Java 的计算能力有了大幅提升";
//使用正则表达式将JDK1.3、JDK1.4替换成JDK
content = content.replaceAll("JDK1\\.3|JDK1\\.4","JDK");
System.out.println(content);
//要求 验证一个 手机号, 要求必须是以 138 139 开头的
content = "13888889999";
if(content.matches("1(38|39)\\d{8}")){
System.out.println("验证成功");
}else{
System.out.println("验证失败");
}
//要求按照 # 或者 - 或者 ~ 或者 数字 来分割
System.out.println("===================");
content = "hello#abc-jack12smith~北京";
String[] split = content.split("#|-|~|\\d+");
for (String s : split) {
System.out.println(s);
}
}
}
标签:java,String,matcher,System,content,分组,学学,类中
From: https://blog.51cto.com/u_15784725/6370445