我有两个字符串如下:
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。正则表达式是什么样的?
有人可以帮忙吗?感谢
答案 0 :(得分:1)
最好使用负前瞻断言:
@"<div>/\*(?:.(?!\*/))*\*/(</div>|<br/></div>|<br></div>)"
^^^^^^^^^^^^^
感兴趣的部分是(?:.(?!\*/))*
。
(?:foo)
只是一个非捕获组 - 现在您可以假装它只是(foo)
。.
是通配符并匹配任何单个字符。(?!bar)
被称为否定先行断言 - 如果bar
不,则匹配,并且 0 -width expression , ie 匹配时不消耗任何字符。因此,我们的想法是匹配一串字符.
,不是后跟*/
,只有然后 */</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, "");