今日份学习: 回顾一下 { 正则表达式 }

笔记

什么是正则表达式?

正则表达式(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));
        }
    } 
}
posted @ 2020-02-11 13:41  带了1个小才艺  阅读(231)  评论(2)    收藏  举报