此模式来自此处接受的答案: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”
我在做什么错了?
答案 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+$)
请注意,它使用$
符号表示行尾