C# 需要有关正则表达式的帮助,而不是替换表达式的所有实例吗

C# 需要有关正则表达式的帮助,而不是替换表达式的所有实例吗,c#,regex,C#,Regex,在这件事上我一整天都在碰壁,对此我几乎不知所措。寻找一些新的视角 示例输入文本: (为清晰起见添加了换行符,而不是在实际数据中) 问题(最后) 有人知道为什么它要取代《我的小说》和《第二章》,而不是《第一章》吗 很抱歉,这篇文章太长了,希望我没有为了便于阅读而试图对其进行格式化 更新: 还有一件事可能会有帮助。在“Novel”之后添加一个额外的break标记可以使提供的代码完美地开始工作。还不知道为什么 示例输入文本(已修改): </div>#My Novel<br />

在这件事上我一整天都在碰壁,对此我几乎不知所措。寻找一些新的视角

示例输入文本:
(为清晰起见添加了换行符,而不是在实际数据中)

问题(最后)
有人知道为什么它要取代《我的小说》和《第二章》,而不是《第一章》吗

很抱歉,这篇文章太长了,希望我没有为了便于阅读而试图对其进行格式化

更新:

还有一件事可能会有帮助。在“Novel”之后添加一个额外的break标记可以使提供的代码完美地开始工作。还不知道为什么

示例输入文本(已修改):

</div>#My Novel<br /><br />
##Chapter1<br />  
It was a dark and stormy night<br />
##Chapter 2<br />
The End
#我的小说

##第1章
那是一个漆黑的暴风雨之夜
##第二章
结局
这是一个经过实际测试并似乎有效的方法

问题是,一旦找到匹配项,搜索就会在第一个匹配项停止的地方继续进行。因此,
#我的小说
的结尾

将不会再次被捕获,因此错过了
#第1章

要捕获类似于第1章的构造,我们可以使用。Lookbehinds强制前缀的存在,即使它在当前位置之前扩展。这还可以防止将其放入替换字符串中:


  • (?
    替换为
    (?为什么数据以结束标记开始?原始输入数据通常会更长,但由于我没有匹配第一个结束标记之前的任何内容,因此我在示例中省略了它,以便于阅读。如果它让您感觉更好,请用
    替换标记。问题是相同的。您就是那个人!Lookback断言工作正常你还应该能够用前瞻性断言替换
    (?
    ):
    (?=
    </div><h1>My Novel</h1><br />
    <h1>Chapter1</h1><br />  
    It was a dark and stormy night<br />  
    <h1>Chapter 2</h1><br />  
    The End
    
    </div><h1>My Novel</h1><br />
    ##Chapter1<br />  
    It was a dark and stormy night<br />  
    <h1>Chapter 2</h1><br />  
    The End
    
    (?<preamble>
        (                             
            ([<]\/\w+\d*[>])|([<]\w+\d*\s*\/[>])   #</tag> or <tag />
        )
        \s*  #optional whitespace                       
    )
    
    (?<hashmarks>
        \#{1,6}      #1-6 hash marks
    )    
    
    (?<content>
        .+?          #header content
     )      
    
    (?<closing>
        ([<](br|\/\s*br|br\s*\/)[>])   #<br>,</br>, or <br />
    )
    
    ${preamble}<h1>${content}</h1>${closing}
    
    Regex.Replace(Source,SrchExp,ReplExpr,RegexOptions.IgnoreCase)
    
    </div>#My Novel<br /><br />
    ##Chapter1<br />  
    It was a dark and stormy night<br />
    ##Chapter 2<br />
    The End
    
    (?<=             # removed the preamble capture and replaced with a lookbehind
        (                             
            ([<]\/\w+\d*[>])|([<]\w+\d*\s*\/[>])   #</tag> or <tag />
        )
        \s*  #optional whitespace                               
    )
    
    (?<hashmarks>
        \#{1,6}      #1-6 hash marks
    )    
    
    (?<content>
        .+?          #header content
     )      
    
    (?<closing>
        ([<](br|\/\s*br|br\s*\/)[>])   #<br>,</br>, or <br />
    )
    
    <h1>${content}</h1>${closing}
    
    </div><h1>My Novel</h1><br />
    <h1>Chapter1</h1><br />
    It was a dark and stormy night<br />
    <h1>Chapter 2</h1><br />
    The End