2

我有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; });

对于 string test1,它返回正确的结果,将全部删除。

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

已更新(用于学习)

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

有人可以帮忙吗?谢谢

4

2 回答 2

1

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

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

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

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

所以,这个想法是匹配一串字符 ,.后面没有,*/只有.*/</div>

于 2013-10-23T07:22:55.033 回答
1

为什么要一步到位?恕我直言,它在两个步骤中更具可读性:

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, "");
于 2013-10-23T07:33:52.870 回答