正则表达式—正则表达式补充知识

在这里插入图片描述

non-capturing groups

non-capturing groups 知识点铺垫1

//non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
//写在前面就算,写在后面就不算(例如:前面的 (?=a).{3}、后面的.{3}(?!a))

public class Test10_1 {

	public static void main(String[] args) {
		// .{3}:出现3次,说明就是三个字母
		Pattern p = Pattern.compile(".{3}");
		String s = "44a66b";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group());
		}
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

non-capturing groups 知识点铺垫2

// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
// 写在前面就算,写在后面就不算(例如:前面的 (?=a).{3}、后面的.{3}(?!a))
public class Test10_2 {

	public static void main(String[] args) {
		
		// 找子串必须以 a 结尾的
		Pattern p = Pattern.compile(".{2}a");
		String s = "44a66b";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group());
		}
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

non-capturing groups 知识点铺垫3

// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
// 写在前面就算,写在后面就不算(例如:前面的 (?=a).{3}、后面的.{3}(?!a))
public class Test10_3 {

	public static void main(String[] args) {
		
		// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
		// non-capturing groups(不捕获、不抓获)
		// 使用 non-capturing groups 找子串必须以 a 结尾的
		// (?=a):()小括号在正常情况下是一个组,这个组是用来匹配字符串的,
		// (?=a)可是如果小括号里面是以 ? 号打头的,那么它不是用来匹配字符串的
		// ?=a:表示前面这个正则表达式 .{3},3个字母最后结束的是 a
		
		// .{3}(?=a):3个字母后面马上跟上 一个 a,但是不会把 a 给打印出来
		// (?=a):不捕获 a,所以不打印 a
		// 所以打印为 444
		Pattern p = Pattern.compile(".{3}(?=a)");
		String s = "444a66b";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group());
		}
		
		
		// 如果这么写会把 444a 给打印出来
		System.out.println();
		Pattern pp = Pattern.compile(".{3}a");
		String ss = "444a66b";
		Matcher mm = pp.matcher(ss);
		while (mm.find()) {
			p(mm.group());
		}
		
		
		// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
		// 以 a 打头并且捕捉 3 个
		// 输出结果为:a66
		System.out.println();
		Pattern ppp = Pattern.compile("(?=a).{3}");
		String sss = "444a66b";
		Matcher mmm = ppp.matcher(sss);
		while (mmm.find()) {
			p(mmm.group());
		}
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

non-capturing groups 知识点铺垫4

// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
// 写在前面就算,写在后面就不算(例如:前面的 (?=a).{3}、后面的.{3}(?!a))

public class Test10_4 {

	public static void main(String[] args) {

		// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
		// 以 a 打头并且捕捉 3 个
		// 输出结果为:a66
		Pattern p = Pattern.compile("(?=a).{3}");
		String s = "444a66b";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group());
		}
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

non-capturing groups 知识点铺垫5

// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
// 写在前面就算,写在后面就不算(例如:前面的 (?=a).{3}、后面的.{3}(?!a))

public class Test10_5 {

	public static void main(String[] args) {
	
		// 前面不能是 a 的
		// 输出结果 444、66b
		Pattern p = Pattern.compile("(?!a).{3}");
		String s = "444a66b";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group());
		}
		
		
		// 输出结果 44a、66b
		// 首先找到 444 
		// (?!a)指的是后面跟着的不是 a,444后面跟着的是 a,
		// 所以它继续往后找 44a 后面跟着的不是 a,所以打印 44a
		// 66b 后面跟着的不是 a 所以打印 66b
		System.out.println();
		Pattern pp = Pattern.compile(".{3}(?!a)");
		String ss = "444a66b";
		Matcher mm = pp.matcher(ss);
		while (mm.find()) {
			p(mm.group());
		}
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

non-capturing groups 知识点铺垫6

// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
// 写在前面就算,写在后面就不算(例如:前面的 (?=a).{3}、后面的.{3}(?!a))

public class Test10_6 {

	public static void main(String[] args) {
		
		// 输出结果 444、a66
		// .{3}(?<!a):从后往前数不能是 a 的
		// 444 从后往前数不是 a
		// a66 从后往前数不是 a
		Pattern p = Pattern.compile(".{3}(?<!a)");
		String s = "444a66b";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group());
		}
		
		
		// 输出结果44a
		// .{3}(?<=a):从后往前数是 a 的,而且包含 a 的,只有 44a 一个
		System.out.println();
		Pattern pp = Pattern.compile(".{3}(?<=a)");
		String ss = "444a66b";
		Matcher mm = pp.matcher(ss);
		while (mm.find()) {
			p(mm.group());
		}
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

non-capturing groups 完整版

// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
// 写在前面就算,写在后面就不算(例如:前面的 (?=a).{3}、后面的.{3}(?!a))
public class Test10 {

	public static void main(String[] args) {
		// .{3}:出现3次,说明就是三个字母
		Pattern p = Pattern.compile(".{3}");
		String s = "44a66b";
		Matcher m = p.matcher(s);
		while (m.find()) {
			p(m.group());
		}
		
		
		// 找子串必须以 a 结尾的
		System.out.println();
		Pattern pp = Pattern.compile(".{2}a");
		String ss = "44a66b";
		Matcher mm = pp.matcher(ss);
		while (mm.find()) {
			p(mm.group());
		}
		
		// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
		// non-capturing groups(不捕获、不抓获)
		// 使用 non-capturing groups 找子串必须以 a 结尾的
		// (?=a):()小括号在正常情况下是一个组,这个组是用来匹配字符串的,
		// (?=a)可是如果小括号里面是以 ? 号打头的,那么它不是用来匹配字符串的
		// ?=a:表示前面这个正则表达式 .{3},3个字母最后结束的是 a
		
		// .{3}(?=a):3个字母后面马上跟上 一个 a,但是不会把 a 给打印出来
		// (?=a):不捕获 a,所以不打印 a
		// 所以打印为 444
		System.out.println();
		Pattern ppp = Pattern.compile(".{3}(?=a)");
		String sss = "444a66b";
		Matcher mmm = ppp.matcher(sss);
		while (mmm.find()) {
			p(mmm.group());
		}
		
		
		// 如果这么写会把 444a 给打印出来
		System.out.println();
		Pattern pppp = Pattern.compile(".{3}a");
		String ssss = "444a66b";
		Matcher mmmm = pppp.matcher(ssss);
		while (mmmm.find()) {
			p(mmmm.group());
		}
		
		
		// non-capturing groups(非捕获组):如果符合这个条件就捕获,如果不符合这个条件就不捕获
		// 以 a 打头并且捕捉 3 个
		// 输出结果为:a66
		System.out.println();
		Pattern ppppp = Pattern.compile("(?=a).{3}");
		String sssss = "444a66b";
		Matcher mmmmm = ppppp.matcher(sssss);
		while (mmmmm.find()) {
			p(mmmmm.group());
		}
		
		// 前面不能是 a 的
		// 输出结果 444、66b
		System.out.println();
		Pattern pppppp = Pattern.compile("(?!a).{3}");
		String ssssss = "444a66b";
		Matcher mmmmmm = pppppp.matcher(ssssss);
		while (mmmmmm.find()) {
			p(mmmmmm.group());
		}
		
		
		// 输出结果 44a、66b
		// 首先找到 444 
		// (?!a)指的是后面跟着的不是 a,444后面跟着的是 a,
		// 所以它继续往后找 44a 后面跟着的不是 a,所以打印 44a
		// 66b 后面跟着的不是 a 所以打印 66b
		System.out.println();
		Pattern ppppppp = Pattern.compile(".{3}(?!a)");
		String sssssss = "444a66b";
		Matcher mmmmmmm = ppppppp.matcher(ssssss);
		while (mmmmmmm.find()) {
			p(mmmmmmm.group());
		}
		

		// 输出结果 444、a66
		// .{3}(?<!a):从后往前数不能是 a 的
		// 444 从后往前数不是 a
		// a66 从后往前数不是 a
		System.out.println();
		Pattern pppppppp = Pattern.compile(".{3}(?<!a)");
		String ssssssss = "444a66b";
		Matcher mmmmmmmm = pppppppp.matcher(ssssssss);
		while (mmmmmmmm.find()) {
			p(mmmmmmmm.group());
		}
		
		
		// 输出结果44a
		// .{3}(?<=a):从后往前数是 a 的,而且包含 a 的,只有 44a 一个
		System.out.println();
		Pattern ppppppppp = Pattern.compile(".{3}(?<=a)");
		String sssssssss = "444a66b";
		Matcher mmmmmmmmm = ppppppppp.matcher(sssssssss);
		while (mmmmmmmmm.find()) {
			p(mmmmmmmmm.group());
		}
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

back refenrences(向前引用)

// back refenrences(向前引用)

public class Test11 {

	public static void main(String[] args) {
		// back refenrences
		// 向前引用
		// (\\d\\d):匹配两个数字,找到 12 ,12作为一个结果
		// \\1:代表向前引用,已经找到 12 这个结果了,第一个找到的结果就是 12 
		// \\1:代表的意思是后面找到的结果必须和我第一次找到的结果要一样
		// \\1:代表第一个组捕捉之后的那个字符串
		Pattern p = Pattern.compile("(\\d\\d)\\1");
		String s = "1212";
		Matcher m = p.matcher(s);
		p(m.matches());
		
		
		// (\\d(\\d)):代表两个组,看到一个左括号就是一个组
		System.out.println();
		Pattern pp = Pattern.compile("(\\d(\\d))\\2");
		String ss = "1212";
		Matcher mm = pp.matcher(ss);
		p(mm.matches());
		
		// 与第二个组抓到的要一致
		System.out.println();
		Pattern ppp = Pattern.compile("(\\d(\\d))\\2");
		String sss = "122";
		Matcher mmm = ppp.matcher(sss);
		p(mmm.matches());
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}

flags的简写

//flags的简写

public class Test12 {

	public static void main(String[] args) {
		// flags的简写
		// Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
		// non-capturing groups 非捕获组   ((?i))
		// (?i dmsux-i dmsux):Nothing,but turns match flags on - off
		p("Java".matches("(?i)(java)"));	// 和上面的那种写法一样(上面的简写)
	}

	public static void p(Object o) {
		System.out.println(o);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值