我想使用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可用。
答案 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}]*
显然意味着要停留在下一个四字符序列中,但它确实会阻止任何不属于{
,}
的字符或者一个数字。当然,它只会在之后确定未来的日期确定