正则表达式练习
文章目录
- 正则表达式练习
- 有条件的爬取数据
- 贪婪爬取和非贪婪爬取
- 正则表达式在字符串方法中的使用
- 分组
- 练习
有条件的爬取数据
package com.example.demo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexDemo{public static void main(String[] args){String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,"+"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";String string = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和JAva11,"+"因为这两个是长期支持版本,下一个长期支持版本是JAVa17,相信在未来不久JAVA17也会逐渐登上历史舞台";// 1.定义正则表达式
// ?理解为前面的数据Java
// =表示在Java后面要跟随的数据
// 但是在获取的时候,只获取前半部分String regex = "Java(?=8|11|17)";
// 需求1String regex1 = "((?i)Java)(?=8|11|17)";
// 需求2String regex2 = "((?i)Java)(8|11|17)";String regex3 = "((?i)Java)(?:8|11|17)";
// 需求3String regex4 = "((?i)Java)(?!8|11|17)";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(string);while(m.find()){System.out.println(m.group());}}
}
贪婪爬取和非贪婪爬取
package com.example.demo;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexDemo{/* 只写+和*表示贪婪匹配+? 非贪婪匹配*? 非贪婪匹配贪婪爬取:在爬取数据的时候尽可能的多获取数据非贪婪爬取:在爬取数据的时候尽可能的多获取数据ab+:贪婪爬取:abbbbbbbbbbbbbb非贪婪爬取:abJava中默认的就是贪婪爬取如果我们在数量词 + * 的后面加上?,那么就是非贪婪爬取*/public static void main(String[] args){String s = "Java自从95年问世以来,abbbbbbbbbbbbbbaaaaaaaaaaaa经历了很多版本,目前企业中用的最多的是Java8和Java11,"+"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
// 1.定义正则表达式String regex = "ab+";
// String regex = "ab+?";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(s);while(m.find()){System.out.println(m.group());}}
}
正则表达式在字符串方法中的使用
package com.example.demo;public class RegexDemo{public static void main(String[] args) {
// public String replaceAll(String regex, String newStr)按正则表达式的规则进行替换
// public String[] split(String regex):按正则表达式的规则切割字符串/* 有一段字符串:小诗诗dqwefqwfqwfqw12312小丹丹dqwefqwfqwfqw12312小慧慧要求1:把字符串中三个姓名之间的字母替换为vs要求2:把字符串中的三个姓名切割出来*/String s = "有一段字符串:小诗诗dqwefqwfqwfqw12312小丹丹dqwefqwfqwfqw12312小慧慧";//细节:
// 方法在底层跟之前一样也会创建文本解析器的对象
// 然后从头开始去读字符串的内容只要有满足的,那么就用第二个参数去替换
// String result1 = s.replaceAll("[\\w&&[^_]]+", "vs");
// System.out.println(result1);String[] arr = s.split("[\\w&&[^_]]+");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
分组
分组就是一个小括号
练习
package com.example.demo;public class RegexDemo{public static void main(String[] args) {
// \\组号:表示把第x组的内容再拿出来用一次String regex1 = "(.).+\\1";System.out.println("a123a".matches(regex1));System.out.println("b123b".matches(regex1));System.out.println("11231".matches(regex1));System.out.println("&123&".matches(regex1));System.out.println("a123b".matches(regex1));System.out.println("-------------------------------");String regex2 = "(.+).+\\1";System.out.println("abc123abc".matches(regex2));System.out.println("b456b".matches(regex2));System.out.println("123789123".matches(regex2));System.out.println("&!@123&!@".matches(regex2));System.out.println("abc123abd".matches(regex2));System.out.println("-------------------------------");
// (.):把首字母看成一组
// \\2:把首字母拿出来再次使用
// *:作用于\\2,表示后面重复的内容出现0次或多次String regex3 = "((.)\\2*).+\\1";System.out.println("aaa123aaa".matches(regex3));System.out.println("bbb456bbb".matches(regex3));System.out.println("111789111".matches(regex3));System.out.println("&&abc&&".matches(regex3));System.out.println("aaa123aab".matches(regex3));}
}
package com.example.demo;public class RegexDemo{public static void main(String[] args) {String str = "我要学学编编编编程程程程程程程程";
// $1 表示把正则表达式中第一组的内容,再拿来用String result = str.replaceAll("(.)\\1+", "$1");System.out.println(result);}
}