使用正则表达式解析内容页面?

时间:2013-07-31 17:45:48

标签: java regex

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

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

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

  

董事责任8

     

公司治理9

     

薪酬报告10

编号样式不一致,数字和字符串之间的空格数确实不同,所以它看起来也像:

  

01目录

     

02战略与亮点

     04主席的发言

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

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

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

干杯

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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*$