2013-01-04 26 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之前有一个(|\.)部分。我把它们拿出来是因为它不符合你的测试用例,你似乎没有指出可以用一个时间段代替空间。如有必要,您可能必须重新安装。

随意适应您的目的。