2013-01-04 30 views
1

我有以下測試用例,我需要開發一個正則表達式以捕獲指定組中的特定信息部分。轉換正則表達式以跳過缺少的信息從python到java-7

的測試情況是:

Title v01 
Title v01 c01 
Title v01 c01-02 
Title c01 
Title c01-02 

需要關注的羣體是:標題,卷,ChapterStart和ChapterEnd。例如在下面的情況下,這些會趕上

Title v02 c05-08 
1  2 3 4 

1.  Title: "Title" 
2.  Volume: "02" 
3. ChapterStart: "05" 
4. ChapterEnd: "08" 

唯一的強制性組是標題,其餘是可選的,如可以在上面列出的其他用例場景中可以看出。

到目前爲止,我能想出以下的正則表達式,成功地將前三種情況:

(?P<Title>.*)(((((|\.)v))(?P<Volume>\d+))((|\.)c(?P<ChapterStart>\d+)(-(?P<ChapterEnd>\d+))?)?) 

不過,我不知道如何對待最後兩種情況在一個正則表達式,而不必須回收組名。該組的名稱是靜態的,因爲接收此正則表達式的程序使用它們來提取信息的特定部件(系列的姓名,職務,音量和章號碼等)

我現在有兩個問題:

  1. 如何使正則表達式處理卷信息丟失的情況。

  2. 如何將此正則表達式從python re兼容性轉換爲Java 1.7正則表達式兼容性,它目前無法匹配完全相同的測試用例。 (我只通過刪除'P'來改變命名組符號)

任何幫助將不勝感激。

注意:標題可以是包含大寫字母,小寫字母,數字,特殊字符,unicode字符,用空格,點,下劃線和/或破折號等分隔的任何數量的單詞。結尾是如果它發現av或c前面有一個空格字符(空格,點,下劃線等)或者如果它到達字符串的末尾。

回答

1

我很驚訝你的正則表達式中的括號,所以我重寫了它。以下是我想出了:

(?<Title>.*?)(v(?<Volume>\d+))?(c(?<ChapterStart>\d+)(-(?<ChapterEnd>\d+))?)? 

注意兩件事情:

  • 這使用了Java 7的命名組
  • 爲標題,我使用的是reluctant quantifier所以它不會採取整個字符串沒有爲卷和章節留下任何東西。您可以閱讀Pattern api documentation中的reluctant,greedypossessive量詞。
  • 之後的卷組沒有?,我相信會導致Title c01不匹配章節。
  • 您在v和c之前有一個(|\.)部分。我把它們拿出來是因爲它不符合你的測試用例,你似乎沒有指出可以用一個時間段代替空間。如有必要,您可能必須重新安裝。

隨意適應您的目的。