今日份学习: 回顾一下 { 正则表达式 }
笔记
什么是正则表达式?
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
常用元字符
| 字符 | 含义 |
|---|---|
| ^ | 开始位置 |
| $ | 结束位置 |
| . | 单个任意字符(不一定包含换行符) |
| \w | 单个"word"字符:字母/数字/下划线/汉字 |
| \s | 单个空白字符(\n\r\t) |
| \d | 单个数字字符 |
| \b | 单词的开始或结束 |
| . | 任意除换行符“\n”外的字符 |
重复
| 字符 | 含义 |
|---|
- | 0次或多次
- | 1次或多次
? | 0次或1次
{n} | n次
{n,} | >=n次
{n,m} | n到m次
一个需要注意的地方 |
+?或?| 表示非贪婪匹配,即尽可能少的匹配,如?重复任意次,但尽可能少重复
.*? | 表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复
比如:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab
选择
| 字符 | 含义 |
|---|---|
| [aeiou] | a/e/i/o/u字符的其中一个 |
| [0-9] | 单个数字字符 |
| [A-Z] | 单个大写字母 |
| [A-Z0-9_] | 大写字母或数字或下划线之一 |
| Hi | hi(或者[Hh]i) |
反义
| 字符 | 含义 |
|---|---|
| [^aeiou] | 除a/e/i/o/u之外的一个字符 |
| [^字符] | 非{字符}的一个字符 |
| \W | 非\w的单个字符 |
| \S | 非\s(空白) |
| \D | 非\d |
| \B | 非开头/结束位置 |
转义
有的字符不可⻅,⽆法⽤⼀个键来代表。
或者有的字符是特定的字符,需要转义才能使用原来的意思。
一个知识点:匹配多行字符串
(?s) 代表可以匹配换行符
举个栗子:
- (?s).*巴拉巴拉\s+巴拉巴拉.*
分组 和 捕获
使用括号来指定一个被捕获的分组:
- 分组的编号从1开始(因为编号0的分组是被提取的这段本身)
- 分组的编号计算只看左括号
- (?😃 不捕获和分配编号,括号只用于分组或标记优先级
String类中的正则应用
String的三个常用的方法:
public String[] split(String regex) {
return split(regex, 0);
}
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
public String replaceFirst(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
}
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
Java中的正则表达式比较昂贵。
- 正则表达式需要解析
- 匹配过程是回溯
在Java中处理捕获
- Pattern
- matcher()
- Matcher
- find()
- group(n)
// 一个练习用的正则表达式:(\d+)K->(\d+)K\((\d+)K\)
// 数据样式:2019-08-21T07:48:18.644+0200: 4.167: [GC (Allocation Failure) [PSYoungGen: 399848K->8944K(501760K)] 422922K->32026K(1550336K), 0.0087488 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
public static void main(String[] args) throws IOException {
Pattern gcPattern = Pattern.compile("(\\d+)K->(\\d+)K\\((\\d+)K\\)");
List<String> lines = Files.readAllLines(new File("gclog.txt").toPath());
for (String line:lines){
System.out.println("-----------");
Matcher matcher = gcPattern.matcher(line);
while(matcher.find()){
System.out.println("before " + Integer.parseInt(matcher.group(1)));
System.out.println("after " + matcher.group(2));
System.out.println("total " + matcher.group(3));
}
}
}

浙公网安备 33010602011771号