在Java中提取没有条件前瞻的文本

时间:2016-02-18 03:20:20

标签: java regex lookahead

我想使用Java正则表达式支持以粗体提取文本。

我可以使用条件前瞻,正则表达式

(\d{2})(\d{1,2})(\d{1,2})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})\s+(\S+)\s+(?(?=.*\d{4}-\d{1,2}-\d{1,2})([^\d{4}]*)|(.*))

但是,Java Pattern类不支持条件前瞻。有没有办法重写正则表达式,以便它适用于Java Pattern类?

160203 03:24:24 mysqld_safe使用/ var / lib / mysql中的数据库启动mysqld守护程序 2016-02-03 03:24:25 0 [警告]不推荐使用隐式DEFAULT值的TIMESTAMP 。请使用--explicit_defaults_for_timestamp服务器选项(详见文档).2016-02-03 03:24:25 0 [注意] /opt/devenv/mysql/mysql-5.6.27-linux-glibc2.5-x86_64/ bin / mysqld(mysqld 5.6.27)以进程29491开始... 2016-02-03 03:24:25 29491 [注意] IPv6可用。

160203 21:33:17 mysqld_safe现在运行的进程数:0

160203 21:33:17 mysqld_safe mysqld restarted 2016-02-03 21:33:18 1125 [注意]服务器主机名(bind-address):'*'; port:33062016-02-03 21:33:18 1125 [注意] IPv6可用。

1 个答案:

答案 0 :(得分:1)

你正在寻找的是一种先见之明:

(?:(?!\d{4}-\d{1,2}-\d{1,2}).)*

这匹配所有内容(但不包括)下一个看起来像日期或下一行的内容,以先到者为准。这样做是在消费之前检查每个角色,以确保它不是日期的第一个角色。要在Java中使用它:

Pattern p = Pattern.compile(
    "(?m)^(\\d{2})(\\d{1,2})(\\d{1,2})\\s+(\\d{1,2}):(\\d{1,2}):(\\d{1,2})\\s+(\\S+)\\s+((?:(?!\\d{4}-\\d{1,2}-\\d{1,2}).)*)");
Matcher m = p.matcher(s);
while (m.find()) {
    // matched text: m.group()
} 

(?m)^确保每个匹配都从一行的开头开始。

我应该注意,这不等同于你的条件,但我认为这是你真正想要的。也许它对你没关系,但是给出了这个假设的输入:

160203 21:33:17 mysqld_safe process1 restarted2016-02-03 21:33:18 1125

...您的正则表达式在1中的process1之前停止。

正则表达式中的[^\d{4}]*显然意味着要停留在下一个四字符序列中,但它确实会阻止任何不属于{}的字符或者一个数字。当然,它只会在之后确定未来的日期确定