1.提出要求896
请参见以下问题:
给你一段文本,请找出所有四个数字连接在一起的子串,这四个数字应该满足①第一个和第四个一样②第二位和第三位一样,比如1221,5775...
2.介绍896要解决以前的问题,我们需要了解几个正则表达式的概念:
1.分组
我们可以用圆括号形成复杂的匹配模式,所以我们可以把圆括号的一部分看作是子表达式/分组。
2.捕获
将正则表达式中子表达式/分组匹配的内容保存在以数字编号或显式命名的内存组中,便于以后引用,从左到右,以分组的左括号为标志,第一组的组号为1,第二组为2,以此类推。组0代表整个正则
3.反向引用
圆括号的内容被捕获后,可以在这个括号后使用,从而写出更实用的匹配模式,我们称之为反向引用这种引用既可以在正则表达式内,也可以在正则表达式外,内反向引用\\分组号,外反向引用$分组号
3.8977看几个小案例1.匹配两个连续的相同数字:(\\d)\\1
2.匹配五个连续的相同数字:(\d)\\1{4}
3.匹配个位与干位相同,十位数与百位数相同,525,1551(\d)(\\d)\\2\\1
4.思考题
请以12321-33399111等形式检索字符串中的商品号,要求满足前面的五位数,然后是一个-号,然后是一个九位数,连续三位数应相同
com中的代码.stulzl.regexpp14Regexpp14package com.stulzl.regexp14;import java.util.regex.Matcher;import java.util.regex.Pattern;///反向引用 897public class Regexp14 { public static void main(String[] args) { String content = h1234el9876lo333 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-33399111等形式检索字符串中的商品号码,满足前面五位数的要求 // ,然后一 个-号,然后是九位数,每三个连续的位置应该是一样的 String regStr = "\\d{5}-(\\d)\\\\\d)\\\\\d)\\3{2}"; Pattern pattern = Pattern.compile(regStr); Matcher matcher = pattern.matcher(content); while(matcher.find()){ System.out.println("找到 "+matcher.group(0)); } }}
4.8988经典结巴程序类似:“我...我要...学学学学...编程java!";
通过正则表达式修改为“我想学编程java”
com中的代码.stulzl.regexp15regexp15package com.stulzl.regexp15;import java.util.regex.Matcher;import java.util.regex.Pattern;//经典结巴程序 898public 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.正则表达式899在String类中使用5.1替换功能String类publicStringreplaceAll(Stringregex,Stringreplacement)
5.2判断功能String类publicbooleanmatches(Stringregex){}//使用Pattern和Matcher
5.3分割功能String类publicString[]split(Stringregex)
comm代码5.15.25.3.stulzl.regexp_string8999StringRegexppackage com.stulzl.regexp_string;//String 正则表达式用于类别 899public 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 发" + "布。2001 年 9 月 24 日,J2EE1.3 发" + "布。2002 年 2 月 26 日,J2SE1.4 发布。自此 Java 计算能力大大提高”; ///使用正则表达式JDK1.3、JDK1.用JDK代替4 content = content.replaceAll(JDK1\.3|JDK1.4","JDK"); System.out.println(content); //要求 验证一个 手机号, 要求必须是以 138 139 开头的 content = "13888889999"; if(content.matches(1)38|39d{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); } }}