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, "");