我正在使用正则表达式编写Java代码来解析从PDF文档中提取的内容页面。
在字符串中,正则表达式必须匹配:一个数字(最多三个)后跟一个空格(或多个)后跟一个单词(或许多[单词:任何字符序列])。反之亦然:( word(s)space(s)digit(s)),它们都必须在字符串中。还要考虑前导空格并且不区分大小写。
提取的内容页面可能如下所示:
董事责任8
公司治理9
薪酬报告10
编号样式不一致,数字和字符串之间的空格数确实不同,所以它看起来也像:
01目录
02战略与亮点
04主席的发言
正在使用的正则表达式匹配任意数量的单词,后跟任意数量的空格,然后是不超过3位的数字:
(?i)([a-z\\s])*[0-9]{1,3}(?i)
它有效但不太好,不能说出我做错了什么?我希望有一种方法可以检测编号样式(在页面的左侧或右侧有页码),而不是重复正则表达式并翻转顺序。
干杯
答案 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*$