如何使用Java正则表达式提取日志cwd与name值拼接为带/的完整路径
Java 日志路径提取拼接实现方案
你的现有正则存在两个适配问题:
\S*只能匹配无空白字符的内容,无法适配包含空格的合法路径- 要求两个双引号包裹的内容连续出现,和你给出的分两行的日志格式不匹配
具体实现方案
正则说明
我们使用[^"]+匹配双引号内的内容,可以兼容含空格的路径,同时根据读取日志的方式分为两种实现:
场景1:一次性读取包含CWD、PATH两行的完整日志段
直接用一个正则匹配两个目标值:
正则表达式:cwd="([^"]+)"[\s\S]*?name="([^"]+)"
- 分组1:对应
cwd的实际值,自动去掉外层双引号 - 分组2:对应
name的实际值,自动去掉外层双引号
Java代码示例:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class LogPathParser { public static void main(String[] args) { // 示例日志内容 String log = "type=CWD test cwd=\"/home/user/app\" other content\n" + "type=PATH test name=\"config/application.yml\" other content"; Pattern pattern = Pattern.compile("cwd=\"([^\"]+)\"[\\s\\S]*?name=\"([^\"]+)\""); Matcher matcher = pattern.matcher(log); if (matcher.find()) { // 直接拼接两个分组的结果 String fullPath = matcher.group(1) + "/" + matcher.group(2); System.out.println(fullPath); // 输出:/home/user/app/config/application.yml } } }
场景2:逐行读取日志流
如果是逐行监控实时日志,就分别匹配两行存值再拼接:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RealtimeLogParser { private static final Pattern CWD_PATTERN = Pattern.compile("cwd=\"([^\"]+)\""); private static final Pattern NAME_PATTERN = Pattern.compile("name=\"([^\"]+)\""); public static void main(String[] args) { // 模拟逐行读取的日志行 String line1 = "type=CWD test cwd=\"/home/user/app\" other content"; String line2 = "type=PATH test name=\"config/application.yml\" other content"; String cwd = null; // 处理CWD行 Matcher cwdMatcher = CWD_PATTERN.matcher(line1); if (cwdMatcher.find()) { cwd = cwdMatcher.group(1); } // 处理PATH行 if (cwd != null) { Matcher nameMatcher = NAME_PATTERN.matcher(line2); if (nameMatcher.find()) { String fullPath = cwd + "/" + nameMatcher.group(1); System.out.println(fullPath); } } } }
内容的提问来源于stack exchange,提问作者hitesh adabala
相关产品推荐
相关产品推荐

