1

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

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

提取的内容页面可能如下所示:

董事职责 8

公司治理 9

薪酬报告10

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

01 内容

02 战略与亮点

04 董事长致辞

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

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

它工作但不太好,不能告诉我做错了什么?我希望有一种方法可以检测两种编号样式(将页码放在字符串的左侧或右侧),而不是重复正则表达式并翻转顺序。

干杯

4

2 回答 2

1

如果每个项目之前或之后总是有一个数字,则可以将此模式与multiline mode一起使用:

"^(?:(?<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*$

于 2013-07-31T18:49:43.283 回答
1

如果要匹配短语,则应在正则表达式中包含要匹配的任何标点符号。AFAIK 正则表达式中没有办法说一个短语是“之前还是之后”,所以你应该翻转一个并附加一个|. 类似于以下内容:

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

此外,您不需要两个实例(?i),因为正则表达式将不区分大小写,直到字符串结尾或遇到(?-i).

于 2013-07-31T18:32:44.920 回答