【问题标题】:Extract text without conditional lookahead in Java在Java中提取没有条件前瞻的文本
【发布时间】:2016-02-18 03:20:19
【问题描述】:

我想使用 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 重启2016-02-03 21:33:18 1125 [注意] 服务器主机名(绑定地址):'*';端口:33062016-02-03 21:33:18 1125 【注】IPv6可用。

【问题讨论】:

  • 您应该阐明提取文本的规则。例如,它必须是行首或某事。
  • 当然,应该提到这一点。我想提取所有文本,直到第一次出现类似于 2016-02-03 的日期模式,或者如果没有找到该模式,直到结束。

标签: java regex lookahead


【解决方案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

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

您的正则表达式中的[^\d{4}]* 显然是要在下一个四字符序列处停止,但它确实会停止任何不是{} 或数字之一的字符。当然,它只是前瞻确定前面有一个日期。

【讨论】:

  • 谢谢艾伦。我对缓和的前瞻没有太多想法。我应该如何使用您给出的表达式来提取我的文本(粗体)?我尝试将您的表达式与我的表达式结合起来,例如 (\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 }).)*.但是,它没有给我全文。
  • 正则表达式匹配的所有内容(示例中的粗体文本)都将在 group(0) 中。我添加了一些代码来演示(group()group(0) 是等效的)。
  • 好的,我知道了。但是,理想情况下,我希望捕获多个组。在这个缓和的环顾之前,我已经有 7 个捕获组。之后出现的任何文本(直到日期模式或字符串结尾)都应该被捕获为第 8 组。无论如何可以完成?
  • 当然,只需将最后一部分包装在另一个捕获组中即可。我已编辑我的答案以添加组。
猜你喜欢
  • 2012-02-15
  • 2023-04-08
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多