1

我有以下测试用例,我需要为其开发一个正则表达式,以便捕获命名组中的特定信息部分。

测试用例是:

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

要查找的组是:Title、Volume、ChapterStart 和 ChapterEnd。例如在下面的情况下,这些会捕获

Title v02 c05-08
1      2   3  4

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

唯一的强制性组是 Title,其他是可选的,如上面列出的其他用例场景中所示。

到目前为止,我能够想出以下正则表达式,它成功地处理了前三种情况:

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

但是,我不知道如何在一个正则表达式中处理最后两种情况,而不必回收组名。组名是静态的,因为接收此正则表达式的程序使用它们来提取特定的信息片段(系列名称、标题、卷和章节编号等)

我现在有两个问题:

  1. 如何让正则表达式处理卷信息缺失的情况。

  2. 如何将此正则表达式从 python re 兼容性转换为 Java 1.7 正则表达式兼容性,目前无法匹配完全相同的测试用例。(我只通过删除“P”来更改命名组符号)

任何帮助将不胜感激。

注意:标题可以是任意数量的单词,包含大写字母、小写字母、数字、特殊字符、unicode 字符,以空格、点、下划线和/或破折号等分隔。所以唯一的方法是识别结尾是否查找前面有空格字符(空格、点、下划线等)或到达字符串末尾的 av 或 c。

4

1 回答 1

1

我对你的正则表达式中括号的数量感到惊讶,所以我重写了它。这是我想出的:

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

注意几件事:

  • 这使用 Java 7 的命名组
  • 对于标题,我使用的是 areluctant quantifier这样它就不会占用整个字符串,而不会为卷和章节留下任何内容。您可以在Pattern api 文档中阅读有关reluctantgreedypossessive量词的信息。
  • 你的没有?后卷组,我相信会导致Title c01章节不匹配。
  • 你的( |\.)在 v 和 c 之前有一个部分。我把它们拿出来是因为它与您的测试用例不匹配,而且您似乎没有表明可以使用句点代替空格。如有必要,您可能必须将其放回原处。

随意适应你的目的。

于 2013-01-10T19:32:31.280 回答