java预搜索分为两种:
- 正向预搜索(正向的含义是预搜索匹配的位置后)
a. 正向预搜索匹配(?=exp)(匹配位置后有被表达式exp匹配的字符)
b. 正向预搜索不匹配(?!exp) ((匹配位置后不能出现被表达式exp匹配的字符)) - 反向预搜索(反向的含义是预搜索匹配的位置前)
a. 反向预搜索(?<=exp)(匹配位置前有被表达式exp匹配的字符)
b. 反向预搜索不匹配(?<!exp) (匹配位置前不能出现被表达式exp匹配的字符)
上面是解释不好理解,下面是演示:
public class rege {
public static void main(String[] args) {
//注:预搜索匹配的是位置,不是具体字符,要谨记,而位置即两个字符间的夹缝,没有宽度。
//例如:"ab"的中间有个位置,"a b"中a和空格间有个位置,空格和b之间也有个位置
//1、预搜索的括号不作为一个组,它不记录预搜索括号内匹配到的字符串
//2、预搜索匹配的字符串的位置,^(?<!hello\s)是错误的用法,因为‘^’匹配的是开始位置,预搜索不能匹配位置的位置
//3、预搜索四种使用
// 合法:正则1-正向预搜索 反向预搜索-正则1
// 合法:正则1-正向预搜索1-正向预搜索2 和 反向预搜索1-反向预搜索1-正则1
// 合法:反向预搜索-正则1-正向预搜索
// 合法:正则1-正向预搜索-正则2
String str1 = "java and python,java good,lang";
//正向预搜索,(?=good)匹配的是位置,即匹配后面跟着good字符串的 java\\s
Pattern p1 = Pattern.compile("java\\s(?=good)");
//正向预搜索不匹配,(?!good)匹配的是后面没有跟着good字符串的 java\\s
Pattern p2 = Pattern.compile("java\\s(?!good)");
//反向预搜索,(?<=hello\\s)匹配的是位置,即匹配紧跟 hello\\s 的java 预搜索的括号不作为一个组
Pattern p3 = Pattern.compile("(?<=hello\\s)java");
//反向预搜索不匹配,(?<!hello\\s)不匹配紧跟 hello\\s 的 java
Pattern p4 = Pattern.compile("(?<!hello\\s)java");
//下面的表达式 (?<=and\\s) 匹配的是python前的位置,这个位置前面是 and\\s
//因此若将表达式写成 java\\s(?<=and\\s)python 是匹配不到字符串的
Pattern p5 = Pattern.compile("and\\s(?<=and\\s)python");
Matcher m1 = p1.matcher(str1);
// while (m1.find()) {
// System.out.println("0: " + m1.group(0)); //java
// System.out.println("匹配后的剩余字符:" + str1.substring(m1.end()));// good
// }
}
}
图解:
//正向预搜索,(?=good)匹配的是位置,即匹配后面跟着good字符串的 java\\s
String str1 = "java and python,java good,lang";
Pattern p1 = Pattern.compile("java\\s(?=good)");
这是正向预搜索匹配的过程,其余正向不匹配,反向搜索和这个异曲同工,是很好推出来的。