代码之家  ›  专栏  ›  技术社区  ›  JohnFx

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

  •  2
  • JohnFx  · 技术社区  · 16 年前

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


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

    期望输出

    </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}
    

    如果重要的话,我正在使用以下C#regex.replace重载:

    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
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Oren Trutner    16 年前

    这是一个经过实际测试并似乎有效的方法。

    <br /> 属于 #My Novel 不会再被抓获,所以 #Chapter1

    捕捉 #第一章 -就像构造一样,我们可以使用 lookbehind assertion

    • 代替 (?<preamble> 具有 (?<=

    • 然后在替换字符串中,移除 ${preamble} 部分。

    现在,整个搜索表达式如下所示:

    (?<=             # 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