2013-07-31 62 views
1

我正在写一个Java代码使用正则表达式来解析从PDF文档中提取的内容页面。使用Regex解析内容页面?

在正则表达式必须匹配的字符串中:一个数字(最多三个)后跟一个空格(或多个)后跟一个单词(或许多[单词:任何字符序列])。反之亦然:(单词(s)空格(s)数字),它们都必须在字符串中。同时考虑领先空间并且不区分大小写。

提取的内容页可能是这个样子:

董事职责8

公司治理9

薪酬报告10

的编号,样式不一致,数字和字符串之间的空格数量会有所不同,因此它也可能如下所示:

01内容

02战略和亮点

04主席声明

我使用匹配的任何数量的单词后跟任意数量的空间,然后一个数字的正则表达式不超过3位:

(?i)([a-z\\s])*[0-9]{1,3}(?i) 

它的工作原理但不是很好,不知道我做错了什么?我希望有一种方法可以检测编号样式(在页面的左侧或右侧有页码),而不是重复正则表达式并翻转顺序。

干杯

+3

当你问一个正则表达式时最重要的事情是非常具体地说,文本将遵循的模式是什么,并不总是可以从例子中得知 – aaronman

+3

首先,“主席声明”的例子包含一个'你在你的正则表达式中没有考虑到的'。 –

+0

@aaronman我在上面提到过: *正在使用的正则表达式匹配任意数量的单词,后跟任意数量的空格,然后是不超过3个数字*的数字。但是也许我还不够清楚,下次还是会确定下来。干杯 – PhDeveloper

回答

1

如果你想匹配短语,你应该包括你想在你的正则表达式匹配任何标点符号。 AFAIK没有办法在正则表达式中如果一个短语是“之前或之后”,所以你应该翻转一个并附加一个|。沿着线的东西:

[a-zA-Z'".,!\s]+\d{1,3}|\d{1,3}[a-zA-Z'".,!\s]+

而且,你不需要的(?i)两个实例,作为正则表达式将应用不区分大小写,直到字符串的结尾,或者如果它遇到(?-i)

+0

这工作得很好,谢谢。 – PhDeveloper

1

您可以使用此模式与多模式,如果总有一个数字之前或每个项目后:

"^(?:(?<nb1>\\d{1,3}) +)?(?<item>\\S+(?: +\\S+)*?)(?: +(?<nb2>\\d{1,3})|$)" 

然后你可以使用m.group('nb1')+m.group('nb2')始终获得每个整场比赛的数量。

但是如果你必须检查至少有一个数字,则必须重复整个模式:

"^(?:(?<nb1>\\d{1,3}) +(?<item1>\\S+(?: +\\S+)*)|(?<item2>\\S+(?: +\\S+)*) +(?<nb2>\\d{1,3})$" 

然后:

item = m.group('item1')+m.group('item2'); 
nb = m.group('nb1')+m.group('nb2'); 

注意:因为图案是开始时固定和最后,你可能需要添加一些可选空间来完成它们的工作:^\\s*\\s*$

+0

以前从未使用* multliline模式*,看起来不错,非常感谢答复。 第一个工作得很好,但你是对的,我需要它找到至少一个数字。 使用第二个正则表达式,我得到了一个找不到匹配的错误,所以我修改了正则表达式为: '“^(?:(? \\ d {1,3})+)?(? \\ S +( (?:+ \\ S +)*?)(? \\ S +(?: + \\ S +)*?)(?: +(? \\ d {1,3})| $)“;' 它工作正常,但由于某种原因,它跳过最后找到的匹配字符。任何理由? – PhDeveloper