这种模式取自这里接受的答案:Regex - Extracting volume and chapter numbers from book titles
我删除了Vol / Volume匹配,因为我只关注章节#s
RegEx:(?i)(((?:C|chapter\s+)(\d+)) | (([a-z]+)\s+Chapter\b))
示例文本(以粗体显示):
Blabla Vol.1第2章 ABCD在XYZ第2卷第一章的时代 Blah blah第2章<------错了 Lablah V6C7 2002 由Foo Bar博士设计的FooBar Vol6 C3 正则表达式:地狱V1第十一章的工具
注意“Blah blah chapter 2”匹配“blah chapter”而不是“chapter 2”
我究竟做错了什么?
正则表达式引擎首先从左到右逐个字符地匹配。如果在同一位置可以匹配多个替代方案,则更改顺序才重要。
如果你想避免你的第二个选择匹配章节,如果后面跟一个数字,你应该明确说明,使用例如否定的前瞻。
(?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
第二种选择总是先匹配。我解决这个问题的方法是使用负向前瞻,所以第二个替代方案与第一个匹配的位置不匹配。
(?i)((?:C|chapter\s+)(\d+))|(?!.*\d+)(([a-z]+)\s+chapter\b)
您可以尝试使用此正则表达式,它会根据您的规则检查最后两个单词,如果您在多行文本中传递标题,则必须设置多行选项:
(?i)(\w+\schapter$)|(chapter\s\d+$)
请注意,它使用$
符号来表示行尾