RegEx模式仅在第二轮交替时匹配

时间:2018-08-31 20:20:28

标签: c# .net regex

此模式来自此处接受的答案:Regex - Extracting volume and chapter numbers from book titles

由于我只关注第s章,因此我去除了音量/音量匹配

RegEx:(?i)(((?:C|chapter\s+)(\d+)) | (([a-z]+)\s+Chapter\b))

示例文本(粗体匹配):

  

Blabla第1卷第2章
  XYZ第2卷时代的ABCD 第一章
  ah bla第2章 <------错误
  Lablah V6 C7 2002
  Foo Bar博士的FooBar Vol6 C3
  正则表达式:Hell V1中的工具第11章

注意,“ blah blah Chapter 2”与“ blah Chapter”匹配,而不是“ chapter 2”

我在做什么错了?

3 个答案:

答案 0 :(得分:3)

正则表达式引擎从左到右依次匹配每个字符。如果可以在同一位置匹配多个替代项,则交替的顺序才重要。

如果您想避免第二个替代匹配的章节,如果后面跟有数字,则应使用例如负面的前瞻。

(?i)(((?:C|chapter\s+)(\d+))|(([a-z]+)\s+Chapter\b(?!\s+\d+)))

这将匹配如下:

Blabla Vol.1 chapter 2 --> chapter 2
ABCD in the era of XYZ volume 2 First Chapter --> First Chapter
Blah blah chapter 2 --> chapter 2
Lablah V6C7 2002 --> C7
FooBar Vol6 C3 by Dr. Foo Bar --> C3
Regex: A tool in Hell V1 Eleventh Chapter --> Eleventh Chapter

答案 1 :(得分:1)

第二种选择总是始终匹配。我要解决的方法是使用负前瞻,因此第二个替代项无法与第一个替代项匹配。

(?i)((?:C|chapter\s+)(\d+))|(?!.*\d+)(([a-z]+)\s+chapter\b)

答案 2 :(得分:0)

您可以尝试使用此正则表达式,它会根据您的规则检查最后两个单词,如果您以多行文本传递标题,则必须设置多行选项:

(?i)(\w+\schapter$)|(chapter\s\d+$)

请注意,它使用$符号表示行尾