文章目录
- 反向引用
- 替换操作
- 大小写转换
反向引用
通过捕获和非捕获我们可以知道:捕获会返回一个捕获组,这个分组是保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以(在正则表达式内部进行引用),这种引用方式就是:反向引用。
根据捕获组的命名规则,反向引用可分为:
- 普通捕获组反向引用:
\k<number>
,通常简写为\number
- 命名捕获组反向引用:
\k<name>
,或者\k'name'
在不同的正则表达式实现中,反向引用的语法差异不小。
JavaScript使用 \ 来标识反向引用。Java 和 Python 将返回一个匹配对象,其中包含名为 group 的数组。
可以把反向引用想象成变量。
反向引用只能用来引用括号里的子表达式。
反向引用匹配通常从 1 开始计数(\1、\2 等)。在许多实现里,第 0 个匹配(\0)可以用来代表整个正则表达式。
我们可以举一个捕获例子:
比如要查找一串字母"qwjyqwjyqwqw"里成对的字母,如果按照我们之前学到的正则表达式,可能是办不到的。
我们用程序思维理一下思路:
1)匹配到一个字母
2)匹配第下一个字母,检查是否和上一个字母是否一样
3)如果一样,则匹配成功,否则失败
这里的思路中,在匹配下一个字母时,需要用到上一个字母进行比较,但是目前的知识实在办不到。
这样捕获就有用处啦,我们可以利用捕获把上一个匹配成功的内容用来作为本次匹配的条件即可。
- 首先匹配一序列字母:
\w*
。我们需要做成分组才能捕获,因此写成这样:(\w*)
- 那这个表达式就有一个捕获组:
(\w*)
- 然后我们要用这个捕获组作为条件,那就可以:
(\w*)\1
这里的 \1
是什么意思呢?根据反向引用的数字命名规则,就需要 \k<1>
或者 \1
,当然,通常都是是后者。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld {
public static void main(String []args) {
String context = "qwjyqwjyqwqw";
String regex = "(\\w*)\\1";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(context);
while (matcher.find()){
System.out.println(matcher.group());
}
}
}
/*
qwjyqwjy
qwqw
*/
替换操作
把字符串中 qw、qqw 换成 q、qq
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld {
public static void main(String []args) {
String context = "qqw qw qw 666";
String regex = "(q*)(w)";
String res = context.replaceAll(regex, "$1");
System.out.println(res);
}
}
/*
qq q q 666
*/
大小写转换
元字符 | 说明 |
| 结束 |
| 把下一个字符转换为小写 |
| 把 |
| 把下一个字符转换为大写 |
| 把 |
\l
和 \u
可以放置在字符(或子表达式0之前,转换下一个字符的大小写。\L
和 \U
可以转换其与 \E
之间所有字符的大小写。
Java 不支持使用大小写转换元字符。
字符串:HELLO WORLD
查找:^(.*)$
替换:\L$1
输出结果:hello world