作用:校验字符串是否满足规则
转义字符 \ 改变后面那个字符原本的含义
//请编写正则表达式验证身份证号码是否满足要求。 //简单要求:18位,前17位任意数字,最后一位可以是数字可以是大写或小写的x String regex="[1-9]\\d{16}(\\d|X|x)"; System.out.println("15040119810705387x".matches(regex)); //true System.out.println("130133197204039024".matches(regex)); //true
在一段文本中查找满足要求的内容
//有如下文本,请按照要求爬取数据。 //Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11, //因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台 //要求:找出里面所有的Javaxx String str="Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台"; //获取正则表达式对象 Pattern p=Pattern.compile("Java\\d{0,2}"); //获取文本匹配器对象 //拿着matcher去读取str,找到符合p规则的子串 Matcher matcher = p.matcher(str); //利用循环获取 while (matcher.find()){ System.out.println(matcher.group()); //输出:Java Java8 Java11 Java17 Java17 }
带条件爬取
//带条件爬取 String regex1="((?i)Java)(?=8|11|17)"; // 输出4个Java // 解释 (?i)表示忽略大小写 ? 理解为前面的数据 = 表示在Java后面要跟随的数据 但是获取时候只获取前半部分 String regex2="((?i)Java)(?:8|11|17)"; //输出Java8 Java11 Java17 Java17 // : 表示获取的时候获取整体 String regex3="((?i)Java)(?!8|11|17)"; //输出Java // ! 表示查找符合去除后面的数字的Java
贪婪爬取和非贪婪爬取
String str1="abbbbbbbbbbbbbbbbbbbbbbcccccccccccccc"; //贪婪爬取 尽可能多的获取数据 String regex="ab+"; //abbbbbbbbbbbbbbbbbbbbbb //非贪婪爬取 尽可能少获取数据 String regex5="ab+?"; //ab
方法
//替换 String str="张三afvde213李四gnrji31王五"; String regex="[\\w&&[^_]]+"; String vs = str.replaceAll(regex, "VS"); System.out.println(vs); //切割 String[] arr = str.split(regex); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); //张三 李四 王五 }
分组
分组就是一个小括号
每组是有组号的,也就是序号。
规则1:从1开始,连续不间断。
规则2:以左括号为基准,最左边的是第一组,其次是第二组,以此类推
捕获分组
就是把这一组中的数据捕获出来,再用一次
正则内部使用:\\组号
//需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符 // 举例: a123a b456b 17891 &abc& String regex1="(.).+\\1"; System.out.println("a123a".matches(regex1)); //true System.out.println("a123b".matches(regex1)); //false //需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符 // 举例: abc123abc b456b 123789123 &!@abc&!@ String regex2="(.+).+\\1"; System.out.println("abc123abc".matches(regex2)); //true System.out.println("123789122".matches(regex2)); //false //需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致 //举例: aaa123aaa bbb456bbb 111789111 &&abc&& String regex3="((.)\\2*).+\\1"; //(.):把首字母看做一组 // \\2:把首字母拿出来再次使用 2是因为首字母是第二组 // *:作用于\\2,表示后面重复的内容出现0次或多次 System.out.println("aaa123aaa".matches(regex3)); //true System.out.println("bbb456bbc".matches(regex3)); //false
正则外部使用:$组号
//将字符申:我要学学编编编编程程程程程程替换为:我要学编程 String str1="我要学学编编编编程程程程程程"; String regex="(.)\\1+"; //(.)表示把重复内容的第一个字符看做一组 // \\1表示第一个字符再次出现 //+ 至少一次 String result = str1.replaceAll(regex, "$1"); //$1 表示把正则表达式中第一组的内容,再拿出来用 System.out.println(result); //我要学编程
非捕获分组
分组之后不需要再用本组数据,仅仅是把数据括起来
注:(?:)(?=)(?!)都是非捕获分组
String str="41080119930228457×"; //非捕获分组特点不占用组号 String regex="[1-9]\\d{16}(?:\\d|X|x)"; String regex1="[1-9]\\d{16}(?:\\d|X|x)\\1"; // \\1会报错 (?:)是非捕获分组,此时是不占用组号的,\\1找不到分组 System.out.println(str.matches(regex1));
标签:regex,Java,String,正则表达式,System,println,out From: https://www.cnblogs.com/futureyearn/p/17249449.html