2013-07-31 108 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