开始和结束点内的条件过滤

时间:2013-10-23 07:19:03

标签: c# asp.net regex

我有两个字符串如下:

test1 = "<div>/*abc*/</div>";
test2 = "<div>/*abc*/Contents/*efg*/</div>";

如果/*...*/仅包含div,我需要删除所有div /*...*/。 以下是我所做的正则表达式:

Regex rx1 = new Regex(@"<div>/\*[^>]+\*/(</div>|<br/></div>|<br></div>)");
TemplateEditorFormatted = rx1.Replace(TemplateEditorFormatted, match => { return String.Empty; });

对于字符串test1,它返回正确的结果,删除所有结果。

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

更新(供学习)

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

有人可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:1)

最好使用负前瞻断言:

@"<div>/\*(?:.(?!\*/))*\*/(</div>|<br/></div>|<br></div>)"
          ^^^^^^^^^^^^^

感兴趣的部分是(?:.(?!\*/))*

  1. (?:foo)只是一个非捕获组 - 现在您可以假装它只是(foo)
  2. .通配符并匹配任何单个字符。
  3. (?!bar)被称为否定先行断言 - 如果bar ,则匹配,并且 0 -width expression ie 匹配时不消耗任何字符。
  4. 因此,我们的想法是匹配一串字符.不是后跟*/,只有然后 */</div>

答案 1 :(得分:1)

为什么一步到位呢? 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, "");