本地爬虫
public static void main(String[] args) {
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//1.获取正则表达式
Pattern p = Pattern.compile("Java\\d{0,2}");
//2.获取文本匹配器的对象
Matcher m = p.matcher(str);
//3.利用循环获取
while (m.find()){
String s = m.group();
System.out.println(s);
}
有条件的爬取
有如下文本,请按照要求爬取数据:
Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
需求2:爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8 Java11 Java17 Java17
需求3:爬取除了版本号为8,11,17的Java文本
public static void main(String[] args) {
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//1.定义正则表达式
String regex = "Java(?=8|11|17)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()){
System.out.println(m.group());
}
}
需求1
public static void main(String[] args) {
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//1.定义正则表达式
String regex = "Java(?:8|11|17)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()){
System.out.println(m.group());
}
}
需求2
public static void main(String[] args) {
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//1.定义正则表达式
String regex = "Java(?!8|11|17)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()){
System.out.println(m.group());
}
}
需求3
贪婪爬取和非贪婪爬取
有如下文本,请按照要求爬取数据:
Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa
经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台
需求1:按照ab+的方式爬取ab,b尽可能多获取
需求2:按照ab+的方式爬取ab,b尽可能少获取
public static void main(String[] args) {
String str = "Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +
"经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//1.定义正则表达式
String regex = "ab+";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()){
System.out.println(m.group());
}
}
贪婪爬取
public static void main(String[] args) {
String str = "Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +
"经历了很多版本,目前企业中用的最多的是Java8和Java11," +
"因为这两个是长期支持的版本,下一个长期支持的版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
//1.定义正则表达式
String regex = "ab+?";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()){
System.out.println(m.group());
}
}
非贪婪爬取
正则表达式在字符串方法中的使用
方法名 | 说明 |
---|---|
public String[] matches(String regex) | 判断字符串是否满足正则表达式的规则 |
public String replaceAll(String regex,String newStr) | 按照正则表达式的规则进行替换 |
public String[] split(String regex) | 按照正则表达式的规则切割字符串 |
有一段字符串:小诗诗qwasdasdaskj465465a小丹丹askjdbnaksjbdaskj654小灰灰
要求1:把字符串中三个姓名之间的字母替换为vs
要求2:把字符串中的三个姓名切割出来
public static void main(String[] args) {
String s = "小诗诗qwasdasdaskj465465a小丹丹askjdbnaksjbdaskj654小灰灰";
String result = s.replaceAll("[\\w&&[^_]]+", "vs");
System.out.println(result);
}
需求1
public static void main(String[] args) {
String s = "小诗诗qwasdasdaskj465465a小丹丹askjdbnaksjbdaskj654小灰灰";
String[] arr = s.split("[\\w&&[^_]]+");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
需求2
分组练习
需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
举例:a123a b456b 17891 &abc& a123b(false)
public static void main(String[] args) {
// \\组号:表示把第x组的内容拿出来用一次
//a123a b456b 17891 &abc& a123b(false)
String regex = "(.).+\\1";
System.out.println("a123a".matches(regex));
System.out.println("b456b".matches(regex));
System.out.println("17891".matches(regex));
System.out.println("&abc&".matches(regex));
System.out.println("a123b".matches(regex));
}
需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
举例:abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)
public static void main(String[] args) {
// \\组号:表示把第x组的内容拿出来用一次
//abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)
String regex = "(.+).+\\1";
System.out.println("abc123abc".matches(regex));
System.out.println("b456b".matches(regex));
System.out.println("123789123".matches(regex));
System.out.println("&!@abc&!@".matches(regex));
System.out.println("abc123abd".matches(regex));
}
需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
举例:aaa123aaa bbb456bbb 111789111 &&abc&& aaa123aab
public static void main(String[] args) {
//aaa123aaa bbb456bbb 111789111 &&abc&& aaa123aab
//(.):把首字母看做一组
//\\2:把首字母拿出来再次使用
//*:作用于\\2,表示后面重复的内容出现0次或多次
String regex = "((.)\\2*).+\\1";
System.out.println("aaa123aaa".matches(regex));
System.out.println("bbb456bbb".matches(regex));
System.out.println("111789111".matches(regex));
System.out.println("&&abc&&".matches(regex));
System.out.println("aaa123aab".matches(regex));
}
口吃替换
需求:
将字符串:我要学学编编编编编编编编编编程程程程程程程程程程程程程程
替换为:我要学编程
public static void main(String[] args) {
/* 需求:
将字符串:我要学学编编编编编编编编编编程程程程程程程程程程程程程程
替换为:我要学编程*/
String str = "我要学学编编编编编编编编编编程程程程程程程程程程程程程程";
//(.):表示把重复内容的第一个字符看做一组
//\\1:表示第一字符再次出现
//+:至少一次
//$1:表示把正则表达式中第一组的内容,再拿出来用
String s = str.replaceAll("(.)\\1+", "$1");
System.out.println(s);
}
捕获分组 |
---|
正则内部使用:\ \组号 |
正则外部使用:$组号 |
符号 | 含义 | 举例 |
---|---|---|
非捕获分组 | ||
(?:正则) | 获取所有 | Java(? : 8 I 11 I 17) |
(?= 正则) | 获取前面部分 | Java(? = 8 I 11 I 17) |
(?!正则) | 获取不是指定内容的前面部分 | Java(? ! 8 I 11 I 17) |
Tips
以上学习内容均来自于B站黑马程序员