我有以下测试用例,我需要为这些测试用例开发一个正则表达式,以便捕获指定组中的特定信息部分。
测试用例如下:
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"唯一的强制组是Title,其他的是可选的,在上面列出的其他用例场景中可以看到。
到目前为止,我已经想出了以下方法,成功地治疗了前三例:
(?P<Title>.*)((((( |\.)v))(?P<Volume>\d+))(( |\.)c(?P<ChapterStart>\d+)(-(?P<ChapterEnd>\d+))?)?)但是,我不知道如何在一个正则表达式中处理最后两种情况,而不必回收组名。组名是静态的,因为接收此正则表达式的程序使用它们提取特定的信息片段(系列名称、标题、卷号和章节号等)。
我现在有两个问题:
任何帮助都将不胜感激。
注意:标题可以是包含大写字母、小写字母、数字、特殊字符、unicode字符、用空格、点、下划线和/或破折号等分隔的任意数量的单词。因此,识别结尾的唯一方法是找到空格字符(空格、点、下划线等)前面的v或c。或者如果它到达字符串的末尾。
发布于 2013-01-10 19:32:31
我对你的正则表达式中括号的数量感到惊讶,所以我重写了它。以下是我想出的:
(?<Title>.*?)( v(?<Volume>\d+))?( c(?<ChapterStart>\d+)(-(?<ChapterEnd>\d+))?)?请注意以下几点:
reluctant quantifier,这样它就不会占用整个字符串,而不会为卷和章节留下任何东西。您可以阅读reluctant、greedy和possessive在模式api文档中的量词。?,我相信这会导致Title c01不匹配章节。( |\.)部分,因为它与您的测试用例不匹配,并且您似乎没有指示可以使用句点而不是空格。如果有必要的话,你可能得把它放回去。可以自由地适应你的目标。
https://stackoverflow.com/questions/14153210
复制相似问题