爬虫:
public static void main(String[] args) {
/*
* 需求1:爬取版本号8,11,17的文本,但只要java,不要版本号
* 需求2: 爬取 java8,java11,java17,java17
* 需求3: 爬取 除了 java8,java11,java17,java17的java文本
* */
String s = "java呜呜呜呜呜呜呜呜呜呜Java8呜呜呜呜呜呜无无无无翁翁多若无群二所无群翁多若所若无群jAva11,阿萨飒飒啊啊" +
"阿沙jaVa17撒大大是多少javA17,阿萨德撒上";
//需求1:
String regex1 = "((?i)java)(?=(8|11|17))";
//需求2:
String regex2 = "((?i)java)(?:(8|11|17))";
//需求2:
String regex3 = "((?i)java)(?!(8|11|17))";
Pattern p = Pattern.compile(regex3);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
}
//获取正则表达式的对象 Pattern p = Pattern.compile("java\\d{0,2}"); //获取文本匹配器对象 Matcher m = p.matcher(str); //利用循环获取 while (m.find()) { String s = m.group(); System.out.println(s); }
贪婪爬取 :在爬取数据的时候尽可能的多获取数据 +?
非贪婪爬取:在爬取数据的时候尽可能的少获取数据 *?
正则表达式的替换:
public static void main(String[] args) {
//public String replaceAll(String regex,String newStr) 按照正则表达式的规则进行替换
//public String[] split(String regex) 按照正则表达式的规则切割字符串
/*
* 有一段字符串:“张三三adas23d_asas4李四四afsjfak124a41王五五”
* 要求1:把字符串中三个名字中间的字母替换为vs
* 要求2:把字符串中的三个名字切割出来
* */
String s = "张三adasdasas李四afsjfaka王五";
//需求1:
// String s1 = s.replaceAll("[\\w&&[^_]]+", "vs");
// System.out.println(s1);
//需求2:
String[] arr = s.split("[\\w&&[^_]]+");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
判断字符串格式:获取分组捕获分组
public static void main(String[] args) {
/*
* 需求1:判断一个字符串的开始与结束字符是否一致,只考虑一个字符
* 举例:a123a b456b 17891 &abc& a123b(false)
* \\组号:表示把第X组的内容再拿出来用一次
* */
String regex1="(.).+\\1";
// (.)表示首字符是任意的, . :表示中间的是任意的 + :至少出现一次 \\1:表示把第一组的数据拿出来再用一次
System.out.println("a123a".matches(regex1));
System.out.println("b456b".matches(regex1));
System.out.println("&abc&".matches(regex1));
System.out.println("a123b".matches(regex1));
System.out.println("-----------------------------------");
/*
* 需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
* 举例:abc123abc aaa222abc aaaxxxaaa 123645123 $#@!000xxx$#@!
* */
String regex2="(.+).+\\1";
// .+:任意的字符至少出现一
System.out.println("abc123abc".matches(regex2));
System.out.println("aaa222abc".matches(regex2));
System.out.println("aaaxxxaab".matches(regex2));
System.out.println("123645123".matches(regex2));
System.out.println("$#@!000xxx$#@!".matches(regex2));
System.out.println("-----------------------------------");
/*
* 需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部的每个字符也需一致
* 举例:aaa123aaa bbb456bbb 11117891111 %%666%%
* */
String regex3="((.)\\2*).+\\1";
//第一个字符(.)是任意的, 把首字符看作一组
// \\2:把首字母拿出来再次使用
// 后面都要和第一个一样, *:作用于2 ,表示后面重复的内容出现0次或多次
System.out.println("aaa123aaa".matches(regex3));
System.out.println("bbb456bbb".matches(regex3));
System.out.println("11117891112".matches(regex3));
System.out.println("%%666%%".matches(regex3));
}
public static void main(String[] args) {
/*
* 我要要要要要学学学学学编编编程程
* 变为:我要学编程
* */
String str ="我要要要要要学学学学学编编编程程";
//需求:把重复的内容替换为 单个的
// 要要要要要 要
// 学学学学学 学
// 编编编 编
// 程程 程
// (.) 把重复内容的第一个字符看做一组
// \\1 表示第一个字符再次出现
// + 至少一次
// &1 把正则表达式中第一组的内容,再拿出来用
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);
}
非捕获分组:分组之后不需要使用本组数据,仅仅是把数据括起来。(?:)、(?=)、(?!)
特点:不占用组号