起点和终点内的条件过滤

本文关键字:条件 过滤 终点 起点 | 更新日期: 2023-09-27 18:36:27

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

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. 正则表达式是什么样子的?

有人可以帮忙吗?谢谢

起点和终点内的条件过滤

你最好使用否定的前瞻断言:

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

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

  1. (?:foo)只是一个非捕获组——现在你可以假装它只是(foo)
  2. .通配符,匹配任何单个字符。
  3. (?!bar)称为否定前瞻断言 - 如果不遵循bar则匹配,并且是零宽度表达式它在匹配时不消耗任何字符。

所以,这个想法是匹配一串字符,.,后面*/,然后才匹配*/</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, "");