正则表达式练习
文章目录
有条件的爬取数据
java
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)";
// 需求1
String regex1 = "((?i)Java)(?=8|11|17)";
// 需求2
String regex2 = "((?i)Java)(8|11|17)";
String regex3 = "((?i)Java)(?:8|11|17)";
// 需求3
String regex4 = "((?i)Java)(?!8|11|17)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(string);
while(m.find()){
System.out.println(m.group());
}
}
}
贪婪爬取和非贪婪爬取
java
package com.example.demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo{
/* 只写+和*表示贪婪匹配
+? 非贪婪匹配
*? 非贪婪匹配
贪婪爬取:在爬取数据的时候尽可能的多获取数据
非贪婪爬取:在爬取数据的时候尽可能的多获取数据
ab+:
贪婪爬取:abbbbbbbbbbbbbb
非贪婪爬取:ab
Java中默认的就是贪婪爬取
如果我们在数量词 + * 的后面加上?,那么就是非贪婪爬取
*/
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());
}
}
}
正则表达式在字符串方法中的使用
java
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]);
}
}
}
分组
分组就是一个小括号
练习
java
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));
}
}
java
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);
}
}