MST

星途 面试题库

面试题:Java中String正则表达式在复杂文本解析中的应用

有一个复杂的日志文本,格式为'[时间戳] [日志级别] [线程名] [消息内容]',例如'[2023 - 10 - 01 12:00:00] INFO [Thread - 1] 系统正常运行'。请用Java中String的正则表达式将日志中的时间戳、日志级别、线程名和消息内容分别提取出来,并存储到相应的变量中,写出完整实现代码及关键步骤说明。
17.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class LogParser {
    public static void main(String[] args) {
        // 日志文本
        String log = "[2023 - 10 - 01 12:00:00] INFO [Thread - 1] 系统正常运行";
        // 正则表达式,用于匹配日志格式
        String pattern = "\\[(.*?)\\] (.*?) \\[(.*?)\\] (.*)";
        // 编译正则表达式
        Pattern r = Pattern.compile(pattern);
        // 创建Matcher对象
        Matcher m = r.matcher(log);
        if (m.find()) {
            // 提取时间戳
            String timestamp = m.group(1);
            // 提取日志级别
            String logLevel = m.group(2);
            // 提取线程名
            String threadName = m.group(3);
            // 提取消息内容
            String message = m.group(4);

            System.out.println("时间戳: " + timestamp);
            System.out.println("日志级别: " + logLevel);
            System.out.println("线程名: " + threadName);
            System.out.println("消息内容: " + message);
        }
    }
}

关键步骤说明

  1. 定义正则表达式\\[(.*?)\\] (.*?) \\[(.*?)\\] (.*),其中\\[(.*?)\\]用于匹配中括号内的内容(时间戳和线程名),(.*?)用于匹配非贪婪模式下的任意字符,空格用于匹配日志各部分之间的分隔符。
  2. 编译正则表达式:使用Pattern.compile(pattern)方法将正则表达式编译为Pattern对象。
  3. 创建Matcher对象:通过Pattern对象的matcher方法,传入要匹配的日志文本,创建Matcher对象。
  4. 执行匹配并提取内容:使用matcher.find()方法查找匹配项,如果找到,则通过matcher.group(n)方法提取对应的组内容,n从1开始,分别对应正则表达式中括号中的捕获组。