RegEx模式仅匹配第二次交替

问题描述 投票:3回答:3

这种模式取自这里接受的答案: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”

我究竟做错了什么?

c# .net regex
3个回答
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
投票

第二种选择总是先匹配。我解决这个问题的方法是使用负向前瞻,所以第二个替代方案与第一个匹配的位置不匹配。

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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.