C# 起始点和结束点内的条件筛选

C# 起始点和结束点内的条件筛选,c#,asp.net,regex,C#,Asp.net,Regex,我有两个字符串,如下所示: test1 = "<div>/*abc*/</div>"; test2 = "<div>/*abc*/Contents/*efg*/</div>"; 对于字符串test1,它返回正确的结果,这将删除所有 但是对于test2,它也会删除所有内容。估计结果不应删除任何内容 更新(用于学习) 对于测试2,如果我想消除//而不是整个div,正则表达式是什么样子的 有人能帮忙吗?谢谢您最好使用消极的前瞻断言: @"<div

我有两个字符串,如下所示:

test1 = "<div>/*abc*/</div>";
test2 = "<div>/*abc*/Contents/*efg*/</div>";
对于字符串
test1
,它返回正确的结果,这将删除所有

但是对于
test2
,它也会删除所有内容。估计结果不应删除任何内容

更新(用于学习)

对于测试2,如果我想消除//而不是整个div,正则表达式是什么样子的


有人能帮忙吗?谢谢

您最好使用消极的前瞻断言:

@"<div>/\*(?:.(?!\*/))*\*/(</div>|<br/></div>|<br></div>)"
          ^^^^^^^^^^^^^
@/\*(?:(?!\*/)*\*/(|
|
)” ^^^^^^^^^^^^^
感兴趣的部分是
(?:.(?!\*/)*

  • (?:foo)
    只是一个非捕获组,现在你可以假装它只是
    (foo)
  • 是一个通配符,与任何单个字符匹配
  • (?!bar)
    被称为一个负前瞻断言,如果
    bar
    不跟随,它将匹配,并且是一个零宽度表达式,即在匹配时不使用任何字符

  • 因此,我们的想法是匹配一个字符串,
    ,该字符串后面不跟
    */
    ,只有当
    */

    时,为什么要一步完成呢?imho通过两个步骤使其更具可读性:

    string s1 = "<div>/*abc*/</div>";
    string s2 = "<div>/*abc*/Contents/*efg*/</div>";
    
    Regex findComments = new Regex(@"/\*.*?\*/");
    Regex findEmptyDivs = new Regex(@"<div></div>");
    
    s1 = findComments.Replace(s1, "");
    s1 = findEmptyDivs.Replace(s1, "");
    
    s2 = findComments.Replace(s2, "");
    s2 = findEmptyDivs.Replace(s2, "");
    
    string s1=“/*abc*/”;
    字符串s2=“/*abc*/Contents/*efg*/”;
    正则表达式findComments=新正则表达式(@“/\*.*?\*/”;
    正则表达式findEmptyDivs=新正则表达式(@“);
    s1=findComments。替换(s1,“”);
    s1=findEmptyDivs.替换(s1,“”);
    s2=findComments。替换(s2,“”);
    s2=findEmptyDivs.Replace(s2,“”);
    
    您不应该在HTML上使用正则表达式。正则表达式只适用于正则语言,HTML是一种上下文无关的语言。它可能适用于非常小的特定示例,但不应该使用它,因为它在一般实践中不起作用!但是如果我只想在test2中选择并删除/*..*/呢?正则表达式是什么样子的?表示如果只包含/*..*/,它将删除整个div,如果div包含其他字符,则只删除/*..*/。可能吗?不幸的是,一个正则表达式不可能做到这一点。我认为即使是C#也不支持可变宽度的lookbehind断言,这正是您所需要的。但无论如何,你可能不应该对正则表达式这样做。相反,首先构建一个循环来查找
    s,然后在每个div中替换
    @/\*.*.*/“
    。(
    使
    *
    不贪婪。)
    string s1 = "<div>/*abc*/</div>";
    string s2 = "<div>/*abc*/Contents/*efg*/</div>";
    
    Regex findComments = new Regex(@"/\*.*?\*/");
    Regex findEmptyDivs = new Regex(@"<div></div>");
    
    s1 = findComments.Replace(s1, "");
    s1 = findEmptyDivs.Replace(s1, "");
    
    s2 = findComments.Replace(s2, "");
    s2 = findEmptyDivs.Replace(s2, "");