Perl正则转Java:Postfix日志解析代码示例请求
从Perl到Java:Postfix日志收件人提取实现
我来帮你把这段Perl的Postfix日志解析逻辑转成可运行的Java代码,完全贴合你要的需求~
先唠唠原Perl代码的作用:
@{$line_info{to}} = $line_info{text} =~ m/\bto=([^,]+),/g;
这段代码会全局匹配日志行里所有以词边界开头的to=,然后提取to=后面到第一个逗号之间的内容,把所有匹配结果存到数组里,用来获取日志里的收件人信息。
下面是对应的可运行Java示例,直接就能跑:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PostfixLogParser { // 对应Perl正则的Java版本,注意转义\b为\\b private static final Pattern TO_PATTERN = Pattern.compile("\\bto=([^,]+),"); public static List<String> extractRecipients(String logLine) { List<String> recipients = new ArrayList<>(); Matcher matcher = TO_PATTERN.matcher(logLine); // 全局匹配所有符合条件的收件人(对应Perl的/g修饰符) while (matcher.find()) { // 提取第一个分组的内容,也就是to=和逗号之间的部分 recipients.add(matcher.group(1)); } return recipients; } public static void main(String[] args) { // 测试用的示例日志行,和你给的格式一致 String sampleLogLine = "Apr 22 07:08:33 server postfix/smtp[12345]: 123ABC: to=<user1@example.com>, relay=mx.example.com[192.168.1.1]:25, delay=1.2, delays=0.1/0/0.5/0.6, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 456DEF)"; List<String> recipients = extractRecipients(sampleLogLine); // 输出结果 System.out.println("提取到的收件人:"); for (String recipient : recipients) { System.out.println("- " + recipient); } } }
代码说明:
- 正则
\\bto=([^,]+),:\\b确保to=是独立的词(不会匹配比如xto=这种情况),([^,]+)捕获to=后面直到第一个逗号的所有内容,完美对应Perl的逻辑。 matcher.find()循环:实现Perl里的全局匹配/g,把所有符合条件的收件人都找出来。- 返回
List<String>:对应Perl里的数组,用来存储多个收件人(如果日志行里有多个to=的情况)。
运行这段代码后,你会得到输出:
提取到的收件人: - <user1@example.com>
如果日志行里有多个收件人,比如to=<user1@example.com>, to=<user2@example.org>,,代码也会把两个都提取出来哦~
内容的提问来源于stack exchange,提问作者MitchBroadhead
相关产品推荐
相关产品推荐

