【问题标题】:Parse line of text after multiline regex pattern在多行正则表达式模式之后解析文本行
【发布时间】:2015-10-27 00:30:42
【问题描述】:

我正在尝试解析通过 pdfbox 转换为 txt 的 pdf 文件中的字段。这是我需要提取的字段示例,“买方姓名和地址:”。这些文档通常包含翻译,并且“:”冒号出现在买方姓名和地址之后的可变字符数。下面的例子。

文本文件..
买家姓名和地址 / NOMBRE Y
DIRECCIÓN DEL COMPRADOR:
此处为买家姓名
文本继续..

这是我尝试的模式/扫描代码。

Scanner sc = new Scanner(txtFile);
Pattern p = Pattern.compile("BUYER NAME AND ADDRESS.*:", Pattern.MULTILINE);
sc.findWithinHorizon(p, 0);
String buyer = sc.nextLine();
buyer = sc.nextLine();
System.out.println("Buyer Name: "+buyer);

这适用于文本文件仅为英文的情况,例如BUYER NAME AND ADDRESS:但如果有额外的字符或换行,则失败。如何修复模式?

【问题讨论】:

  • 您的意思是将Pattern.DOTALL"BUYER NAME AND ADDRESS.*" 一起使用吗?
  • 谢谢马拉卡,我想我需要阅读正则表达式语法。
  • @Kurter21 发布了一个答案,这个问题有两个简单的解决方案和无数其他的解决方案 ;-)

标签: java regex text java.util.scanner


【解决方案1】:

给定的正则表达式"BUYER NAME AND ADDRESS.*:"匹配“BUYER NAME AND ADDRESS”,后跟任意数量的字符,后跟冒号,因此这将匹配最后一个冒号之前的所有内容,因为正则表达式是贪婪的,您可以使用.*?(非贪婪)以获得所需的行为。此外,您需要将 MULTILINE(^$ 匹配行首和行尾)更改为 DOTALL(. 也匹配换行符)以使这项工作如 @stribizhev 所说。

这也可以通过使用[^:] 来纠正,[^...] 表示不是那些字符。像这样你不需要任何修饰符(我在最后删除了:,因为如果你这样做你可能不需要它):

"BUYER NAME AND ADDRESS[^:]*"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多