Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式模式仅在第二次替换时匹配_C#_.net_Regex - Fatal编程技术网

C# 正则表达式模式仅在第二次替换时匹配

C# 正则表达式模式仅在第二次替换时匹配,c#,.net,regex,C#,.net,Regex,此模式取自此处接受的答案: 因为我只关心章节,所以我去掉了卷/卷匹配 正则表达式:(?i)((?:C章\s+)(\d+)([a-z]+)\s+章\b)) 示例文本(粗体匹配): 布拉布拉第一卷第二章 XYZ时代的ABCD第2卷第一章 布拉赫布拉赫第2章你可以试试这个正则表达式,它根据你的规则检查最后两个单词,如果你在多行文本中传递标题,你必须设置多行选项: (?i)(\w+\schapter$)|(chapter\s\d+$) 注意:它使用$符号表示行尾正则表达式引擎首先从左到右逐个字符进行

此模式取自此处接受的答案:

因为我只关心章节,所以我去掉了卷/卷匹配

正则表达式:
(?i)((?:C章\s+)(\d+)([a-z]+)\s+章\b))


示例文本(粗体匹配):

布拉布拉第一卷第二章 XYZ时代的ABCD第2卷第一章
布拉赫布拉赫第2章你可以试试这个正则表达式,它根据你的规则检查最后两个单词,如果你在多行文本中传递标题,你必须设置多行选项:

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

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

正则表达式引擎首先从左到右逐个字符进行匹配。只有在同一位置可以匹配多个备选方案时,备选方案的顺序才有意义

如果您想避免第二个备选方案来匹配章节,如果后面跟一个数字,您应该明确说明,例如使用负前瞻

(?i)((?:C |章\s+)(\d+)([a-z]+)\s+章\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)

与通过@SebastianProske的断言一起,它最好写成
(?i)((c(?:hapter\s+)(\d+)|(([a-z]+)\s+章\b(?!\s+\d))