正则表达式
正则表达式
资源
可视化工具
https://www.jyshare.com/front-end/7625/#!flags=&re=%5E(a%7Cb)*%3F%24
正则表达式菜鸟教程
使用非捕获元 进行匹配
"?=" 根据后续内容匹配
举例:
public static void testA() {
Pattern patternWithNum = Pattern.compile("runo*b(?=[\\d+])");
Pattern patternWithoutNum = Pattern.compile("runo*b(?=[\\D+])");
String str = "runob123runoobabc";
Matcher matcherNum = patternWithNum.matcher(str);
while (matcherNum.find()) {
String group = matcherNum.group(0);
System.out.println(group);
}
Matcher matcherWithoutNum = patternWithoutNum.matcher(str);
while (matcherWithoutNum.find()) {
String group = matcherWithoutNum.group(0);
System.out.println(group);
}
}
"?<=" 根据前缀内容匹配
"?!" 根据后续内容 不是 ... 匹配
"?<!" 根据前缀内容 不是 ... 匹配
匹配与捕获组
除了非捕获元 进行的前缀、后缀匹配,其它都会匹配到
匹配到一段字符后,可以对这段字符串的子字符串进行分组,也就是捕获组
eg:
有正则表达式: (\d)234(\w)
有字符串: abc1234def2234ghi3234jkl4234mno
那么其中的匹配和分组情况如下
匹配 | 捕获组1 | 捕获组2 |
---|---|---|
1234d | 1 | d |
2234g | 2 | g |
3234j | 3 | j |
4234m | 4 | m |
反向引用
大概的原理就是 正则表达式匹配过程时,会将捕获组内容缓存下来。在后续的匹配过程中,可以使用缓存好的捕获组信息进行判断。(内部引用)
也可以在匹配结束后。使用外部程序来 引用缓存的 捕获组内容(外部引用)
https://blog.csdn.net/codegarble/article/details/53012101
反向引用主要用来匹配相同的内容、数据
eg:
其中 "\1+" 就是内部反向引用 ,"$1"就是外部反向引用。这里数字1就是捕获组的编号(从1开始)
public static void testB() {
String c = "我我要学学学java";
Pattern pattern =Pattern.compile("(.)\\1+");
Matcher matcher = pattern.matcher(c);
String s = matcher.replaceAll("$1");
System.out.println(s);
//我要学java
}
License:
CC BY 4.0